C++开发中级


852 浏览 5 years, 4 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++程序员不熟悉这个概念。