Maison > développement back-end > C++ > le corps du texte

Fonctions virtuelles C++ et héritage virtuel : découvrir les complexités de l'héritage multiple

王林
Libérer: 2024-04-28 21:03:01
original
459 Les gens l'ont consulté

Fonctions virtuelles : autorisez les classes dérivées à remplacer les fonctions des classes de base. Lorsque le pointeur de la classe de base pointe vers un objet de classe dérivée, la fonction virtuelle de la classe dérivée est appelée. Héritage virtuel : résolvez le problème de l'héritage du diamant dans l'héritage multiple. Assurez-vous qu'une seule instance de chaque classe de base existe dans la classe dérivée.

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

Fonctions virtuelles C++ et héritage virtuel : révéler les complexités de l'héritage multiple

Fonctions virtuelles

Une fonction virtuelle est un type spécial de fonction membre en C++ qui permet à une classe dérivée de remplacer les fonctions d'une classe de base. Lorsqu'un pointeur de classe de base ou une référence pointe vers un objet de classe dérivée, la fonction virtuelle de la classe dérivée sera appelée.

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;
};
Copier après la connexion

Héritage virtuel

L'héritage virtuel est une technique utilisée pour résoudre le problème d'héritage du diamant qui se produit dans l'héritage multiple (également connu sous le nom d'ambiguïté de l'héritage multiple).

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; }
};
Copier après la connexion

L'héritage virtuel garantit qu'une seule instance existe dans chaque classe de base (Animal)在派生类(SiberianHusky), évitant ainsi le problème de l'héritage du diamant.

Cas pratique

#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;
}
Copier après la connexion

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!