가상 상속은 클래스가 동일한 기본 클래스를 가진 둘 이상의 하위 클래스에서 상속될 때 다중 상속의 "다이아몬드 문제"를 해결합니다. 파생 클래스의 상속 사양에 virtual 키워드를 사용하면 파생 클래스는 기본 클래스의 복사본을 얻지 않고 대신 포인터를 통해 기본 클래스의 메서드에 간접적으로 액세스합니다. 이런 방식으로 파생 클래스는 궁극적으로 기본 클래스에서 파생되는 클래스로부터 하나의 메서드만 가져오므로 모호성을 피할 수 있습니다.
C++ 멤버 함수에 대한 자세한 설명: 가상 상속 및 객체 메서드의 다이아몬드 문제
가상 상속은 다중 상속의 "다이아몬드 문제"를 해결하는 상속 메커니즘입니다. 다이아몬드 문제는 클래스가 동일한 기본 클래스를 갖는 두 개 이상의 하위 클래스에서 동시에 상속될 때 발생합니다.
실제 예:
다음 코드 조각을 고려하세요.
class Animal { public: virtual void makeSound() { cout << "Animal makes a sound" << endl; } }; class Cat : public Animal { public: virtual void makeSound() { cout << "Cat meows" << endl; } }; class Dog : public Animal { public: virtual void makeSound() { cout << "Dog barks" << endl; } }; class Siamese : public Cat, public Dog { // 钻石问题 };
일반적인 상속 규칙에 따라 Siamese
클래스는 Cat
및 Dog에서 파생됩니다.
각 클래스는 makeSound()
메서드를 상속합니다. 그러나 Siamese
클래스에 동일한 이름을 가진 두 개의 메서드가 있으므로 makeSound()
메서드를 호출할 때 모호성이 발생합니다. Siamese
类将从 Cat
和 Dog
类分别继承一个 makeSound()
方法。然而,这会导致在调用 makeSound()
方法时产生歧义,因为 Siamese
类中存在两个同名方法。
解决钻石问题:
为了解决钻石问题,我们可以使用虚继承。在虚继承中,派生类不会获得基类的实际副本,而是通过一个指针间接访问基类的方法。
要使用虚继承,请在派生类继承规范中使用 virtual
关键字:
class Siamese : public virtual Cat, public virtual Dog { };
这样,Siamese
类将只获得一个 makeSound()
方法,该方法来自最终从 Animal
类中派生的类 (Cat
或 Dog
中的一个)。
输出:
Siamese siamese; siamese.makeSound(); // Cat meows
在上面的示例中,Siamese
类从 Cat
类继承了 makeSound()
方法,因为它是第一个从 Animal
virtual
키워드를 사용하세요. 🎜rrreee🎜이런 식으로 Siamese
클래스는 하나만 가져옵니다. <code>Animal
클래스(Cat
또는 Dog
)에서 궁극적으로 파생되는 클래스의 makeSound() 메서드입니다. 🎜🎜🎜출력: 🎜🎜rrreee🎜위의 예에서 Siamese
클래스는 Cat
클래스에서 makeSound()
메서드를 상속합니다. Animal
클래스에서 파생된 첫 번째 기본 클래스입니다. 🎜위 내용은 C++ 멤버 함수에 대한 자세한 설명: 가상 상속 및 객체 메서드의 다이아몬드 문제의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!