C++ 仮想関数と仮想継承: 多重継承の複雑さを明らかにする

王林
リリース: 2024-04-28 21:03:01
オリジナル
479 人が閲覧しました

仮想関数: 派生クラスが基本クラスの関数をオーバーライドできるようにします。基本クラス ポインターが派生クラス オブジェクトを指す場合、派生クラスの仮想関数が呼び出されます。仮想継承: 多重継承におけるダイヤモンド継承の問題を解決します。派生クラスには、各基本クラスのインスタンスが 1 つだけ存在するようにしてください。

C++ 虚拟函数与虚继承:揭示多重继承中的复杂性

#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 サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート