C++开发中级
998 浏览 5 years, 11 months
6.8 虚基类
版权声明: 转载请注明出处 http://www.codingsoho.com/虚基类
在本章前面,您已经学习了歧义基类,当多个基类拥有公共父类时就会发生这种情况,如下图所示。我们建议的解决方案是被共享的父类本身不要有任何功能。这样就永远都无法调用这个类的方法,因此也就不存在歧义。
如果您确实想让被共享的基类拥有自己的功能,C++提供了另一种机制来解决这个问题。如果被共享的基类是一个虚基类(virtual base class
),就不存在歧义。下面的代码在Animal基类中添加了sleep()方法,并且修改了Dog以及Bird类,从而将Animal作为虚基类继承。如果不使用virtual关键字,用DogBird对象调用sleep()会产生歧义,从而导致编译器错误,因为DogBird有Animal的两个子对象,一个来自Dog;另一个来自Bird。
然而,如果Animal被作为虚基类,DogBird就只有Animal的一个子对象,因此调用sleep()也就不存在歧义。
class Animal{
public:
virtual void eat() = 0;
virtual void sleep() {
cout << "zzzzzz ..." << endl;
}
};
class Dog : public virtual Animal{
public:
virtual void bark(){
cout << "Wolf!" << endl;
}
virtual void eat(){
cout << "The dog has eaten" << endl;
}
};
class Bird : public virtual Animal{
public:
virtual void chirp(){
cout << "Chirp!" << endl;
}
virtual void eat(){
cout << "The bird has eaten" << endl;
}
};
class DogBird : public Dog, public Bird{
public:
virtual void eat(){
Dog::eat();
}
};
int main(){
DogBird myConfuseAnimal;
myConfuseAnimal.sleep(); //Not ambiguous because Animal is virtual
}
虚基类是在类层次结构中避免歧义的好办法。唯一的缺点是许多C++程序员不熟悉这个概念。