仮想関数: 派生クラスが基本クラスの関数をオーバーライドできるようにします。基本クラス ポインターが派生クラス オブジェクトを指す場合、派生クラスの仮想関数が呼び出されます。仮想継承: 多重継承におけるダイヤモンド継承の問題を解決します。派生クラスには、各基本クラスのインスタンスが 1 つだけ存在するようにしてください。
#C 仮想関数と仮想継承: 多重継承の複雑さを明らかにする仮想関数仮想関数は C A の一種です派生クラスが基本クラスの関数をオーバーライドできるようにする特別なタイプのメンバー関数。基本クラスのポインターまたは参照が派生クラスのオブジェクトを指す場合、派生クラスの仮想関数が呼び出されます。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; } };仮想継承により、各基本クラス (
Animal) が派生クラス (
SiberianHusky) にインスタンスを 1 つだけ持つことが保証されるため、ダイヤモンド継承の問題が回避されます。
#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; }
以上がC++ 仮想関数と仮想継承: 多重継承の複雑さを明らかにするの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。