C++ 虚拟函数与虚继承:揭示多重继承中的复杂性
虚拟函数:允许派生类重写基类中的函数。当基类指针指向派生类对象时,调用派生类的虚拟函数。虚继承:解决多重继承中的菱形继承问题。确保每个基类在派生类中只存在一个实例。
C++ 虚拟函数与虚继承:揭示多重继承中的复杂性 虚拟函数虚拟函数是 C++ 中一种特殊类型的成员函数,允许派生类重写基类中的函数。当基类指针或引用指向派生类对象时,将会调用派生类的虚拟函数。
class Shape {
public:
virtual double area() const = 0; // 纯虚函数
};
class Rectangle : public Shape {
public:
Rectangle(double width, double height) : m_width(width), m_height(height) {}
double area() const override { return m_width * m_height; } // 重写虚函数
private:
double m_width;
double m_height;
};
虚继承
虚继承是一种技术,用于解决多重继承中发生的菱形继承问题(也称为多重继承的歧义性)。
class Animal {
public:
virtual void speak() const { cout << "Animal speaks" << endl; }
};
class Dog : virtual public Animal { // 虚继承
public:
void speak() const override { cout << "Dog barks" << endl; }
};
class Cat : virtual public Animal { // 虚继承
public:
void speak() const override { cout << "Cat meows" << endl; }
};
class SiberianHusky : public Dog, public Cat { // 多重继承
public:
void speak() const override { cout << "Siberian Husky howls" << endl; }
};
虚继承确保每个基类()在派生类()中只存在一个实例,从而避免菱形继承问题。
实战案例#include <iostream>
using namespace std;
class Shape {
public:
virtual double area() const = 0;
};
class Rectangle : public Shape {
public:
Rectangle(double width, double height) : m_width(width), m_height(height) {}
double area() const override { return m_width * m_height; }
private:
double m_width;
double m_height;
};
class Circle : public Shape {
public:
Circle(double radius) : m_radius(radius) {}
double area() const override { return M_PI * m_radius * m_radius; }
private:
double m_radius;
};
int main() {
// 创建形状的父类指针
Shape* shape;
// 创建矩形对象并将其分配给父类指针
shape = new Rectangle(5, 10);
cout << "矩形面积:" << shape->area() << endl;
// 创建圆形对象并将其分配给父类指针
shape = new Circle(3);
cout << "圆形面积:" << shape->area() << endl;
return 0;
}
声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至201542412@QQ.com举报,一经查实,本站将立刻删除。
相关推荐
-
如何理解golang函数签名
go 函数签名由函数名、参数类型和返回值类型组成。参数类型指定函数接受的参数,用逗号分隔。返回值类型指定函数返回的值,同样用逗号分隔。例如,函数签名 func add(x int, y int) in
-
c++中的setw函数有什么用
setw 函数用途:setw 函数用于设置输出的字段宽度。它接收一个整数值参数,该参数指定输出字段的宽度。语法:="cpp"std::setw(int width);/cod
-
c++中cin.getline函数用法
cin.getline() 函数的用法简介:cin.getline() 函数是 C++ 中用于从标准输入读取一行字符的函数。该函数从流中读取字符,直到遇到换行符 (\n) 或到达指定的最大字符数。语法
-
C++ 内联函数的最佳实践技巧分享
内联函数是一种将函数代码直接替换到调用点的 c++++ 特性,从而优化性能。最佳实践包括:谨慎使用内联,只针对微小、频繁调用的函数。避免递归和循环,因为它们会增加函数大小和复杂度。保持内联函数小巧,通
-
golang函数类型的分类及作用
go 语言中的函数类型是函数指针的类型,可分为以下几类:func:最通用函数类型参数类型和返回值类型:指定函数参数和返回值类型可变参数:允许函数接受任意数量的参数命名返回值:允许函数具有多个具有名称的