http://www.cnblogs.com/liangyan19910818/archive/2011/10/23/2221747.html
声明虚基类的一般形式为:
class 派生类名 :
virtual 继承方式 基类名
经过这样的声明后,当基类通过多条派生路径被一个派生类继承时,该派生类只继承该派生类一次,也就是说,基类成员只保留一次。为了保证虚基类在派生类中只继承一次,应当在该基类的所有直接派生类中声明为虚基类,否则仍然会出现对基类的多次继承
规定:在最后的派生类中不仅要负责对其直接基类进行初始化,还要负责对虚基类初始化
C++编译系统只执行最后的派生类对虚基类的构造函数的调用,而忽略虚基类的其他派生类对虚基类的构造函数的调用,这就保证了虚基类数据成员不会被对此初始化
#include <iostream>
#include <string>
using namespace std;
//声明公共基类Person
class Person
{
public:
Person(string nam , char se , int a)
{
name = nam ;
sex = se ;
age = a ;
}
protected:
string name ;
char sex ;
int age ;
};
//声明Person的直接派生类Teacher
class Teacher : virtual public Person //声明Person为公共继承的虚基类
{
public:
Teacher(string nam , char se , int a , string ti) : Person(nam , se , a)
{
title = ti ;
}
protected:
string title ;
};
//声明Person的直接派生类Student
class Student : virtual public Person //声明Person为公共继承的虚基类
{
public:
Student(string nam , char se , int a , float sco) : Person(nam , se , a) , score(sco) {}
protected:
float score ;
};
//声明多重继承的派生类Graduate
class Graduate : public Teacher , public Student
{
public:
Graduate(string nam , char se , int a , string ti , float sco , float wa) : Person(nam , se , a) , Teacher(nam , se , a , ti) , Student(nam , se , a , sco) , wage(wa) {}
void show()
{
cout << "name :" << name << endl ;
cout << "sex :" << sex << endl ;
cout << "age :" << age << endl ;
cout << "title :" << title << endl ;
cout << "score :" << score << endl ;
cout << "wage :" << wage << endl ;
}
private:
float wage ;
};
//主函数
int main(void)
{
Graduate grad("Wangli" , 'f' , 24 , "assistant" , 89.6 , 2000.6);
grad.show();
return 0 ;
}
在Graduate类中,只保留一份基类的成员,因此可以用Graduate类中的show函数引用Graduate类对象中的公共基类Person的数据成员name , sex , age 的值,不需要加基类名和域运算符 '' :: '' ,不会产生二义性。