가상 함수: 파생 클래스가 기본 클래스의 함수를 재정의할 수 있도록 허용합니다. 기본 클래스 포인터가 파생 클래스 개체를 가리키면 파생 클래스의 가상 함수가 호출됩니다. 가상 상속: 다중 상속에서 다이아몬드 상속 문제를 해결합니다. 각 기본 클래스의 인스턴스가 파생 클래스에 하나만 있는지 확인하십시오.
가상 함수는 파생 클래스가 기본 클래스의 함수를 재정의할 수 있도록 하는 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!