聲明虛基類的一般形式為:
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 的值,不需要加基類名和域運算符 '' :: '' ,不會産生二義性。