天天看點

虛基類(virtual base class)

聲明虛基類的一般形式為:

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 ;
}
           
虛基類(virtual base class)

在Graduate類中,隻保留一份基類的成員,是以可以用Graduate類中的show函數引用Graduate類對象中的公共基類Person的資料成員name , sex , age 的值,不需要加基類名和域運算符 '' :: '' ,不會産生二義性。

繼續閱讀