首頁  >  文章  >  後端開發  >  C++ 虛擬函數與虛繼承:揭示多重繼承中的複雜性

C++ 虛擬函數與虛繼承:揭示多重繼承中的複雜性

王林
王林原創
2024-04-28 21:03:01473瀏覽

虛擬函數:允許衍生類別重寫基底類別中的函數。當基底類別指標指向衍生類別物件時,呼叫派生類別的虛擬函數。虛繼承:解多重繼承中的菱形繼承問題。確保每個基底類別在衍生類別中只存在一個實例。

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; }
};

虛繼承確保每個基底類別(Animal)在衍生類別(SiberianHusky)中只存在一個實例,從而避免菱形繼承問題。

實戰案例

#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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn