>백엔드 개발 >C++ >C++ 가상 함수 및 가상 상속: 다중 상속의 복잡성 파악

C++ 가상 함수 및 가상 상속: 다중 상속의 복잡성 파악

王林
王林원래의
2024-04-28 21:03:01481검색

가상 함수: 파생 클래스가 기본 클래스의 함수를 재정의할 수 있도록 허용합니다. 기본 클래스 포인터가 파생 클래스 개체를 가리키면 파생 클래스의 가상 함수가 호출됩니다. 가상 상속: 다중 상속에서 다이아몬드 상속 문제를 해결합니다. 각 기본 클래스의 인스턴스가 파생 클래스에 하나만 있는지 확인하십시오.

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으로 문의하세요.