虚基类常用于多继承的情形,如果假设,没接触过虚基类。没有虚基类的情况,就会发生多重继承的二义性。因此本文先从没有虚基类的多重继承引发的二义性谈起,再讲解如何用虚基类转变这种错误。
问题再现我要在多继承的情况下打印age
#includeusing namespace std; class Animal{ public: Animal(int age):m_nAge(age){ } protected: int m_nAge; }; class Bird: public Animal{ public: Bird(int age): Animal(age){ } }; class Fish: public Animal{ public: Fish(int age):Animal(age){ } }; class WB:public Bird,public Fish{ public: WB(int b_age,int f_age): Bird(b_age), Fish(f_age){ } void print_animalage(){ cout << "age = " << Bird::m_nAge << endl; cout << "age = " << Fish::m_nAge << endl; } }; int main() { WB wa(5,6); wa.print_animalage(); return 0; }
如果只是想打印出m_nage那就需要解决二义性。引入虚基类。对于虚基类的派生类来首,其构造函数不仅调用直接基类构造函数,还需要调用虚基类的构造函数。
引入虚基类:代码1重新修改#include虚基类总结using namespace std; class Animal{ public: Animal(int age):m_nAge(age){ } protected: int m_nAge; }; class Bird:virtual public Animal{ public: Bird(int age): Animal(age){ } }; class Fish:virtual public Animal{ public: Fish(int age):Animal(age){ } }; class WB:public Bird,public Fish{ public: WB(int b_age,int f_age): Bird(b_age), Fish(f_age), Animal(b_age){ } void print_animalage(){ cout << "age = " << m_nAge << endl; } }; int main() { WB wa(5,6); wa.print_animalage(); return 0; }
虚基类就是防止多继承情况下的二义性,而且也会防止多次调用同样构造函数。对于虚基类的构造函数,C++编译器的调用方式是:由最后定义的派生类即类结构中最底层的派生类在定义对象时完成虚基类构造函数调用,该派生其他基类直接忽略。



