Home > Backend Development > C++ > body text

C++ Virtual Functions and Virtual Inheritance: Uncovering the Complexities of Multiple Inheritance

王林
Release: 2024-04-28 21:03:01
Original
479 people have browsed it

Virtual function: allows derived classes to override functions in base classes. When the base class pointer points to a derived class object, the virtual function of the derived class is called. Virtual inheritance: Solve the diamond inheritance problem in multiple inheritance. Ensure that only one instance of each base class exists in the derived class.

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

C Virtual functions and virtual inheritance: Revealing the complexity of multiple inheritance

Virtual functions

Virtual functions are a type of C A special type of member function that allows a derived class to override functions in a base class. When a base class pointer or reference points to a derived class object, the virtual function of the derived class will be called.

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;
};
Copy after login

Virtual inheritance

Virtual inheritance is a technique used to solve the diamond inheritance problem that occurs in multiple inheritance (also known as the ambiguity of multiple inheritance).

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; }
};
Copy after login

Virtual inheritance ensures that each base class (Animal) has only one instance in the derived class (SiberianHusky), thus avoiding the diamond inheritance problem.

Practical case

#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;
}
Copy after login

The above is the detailed content of C++ Virtual Functions and Virtual Inheritance: Uncovering the Complexities of Multiple Inheritance. For more information, please follow other related articles on the PHP Chinese website!

Related labels:
source:php.cn
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template