虚基类(virtual base class)

来源:互联网 发布:ps美工软件 编辑:程序博客网 时间:2024/05/16 13:59

声明虚基类的一般形式为:

class 派生类名 : virtual 继承方式 基类名


经过这样的声明后,当基类通过多条派生路径被一个派生类继承时,该派生类只继承该派生类一次,也就是说,基类成员只保留一次。为了保证虚基类在派生类中只继承一次,应当在该基类的所有直接派生类中声明为虚基类,否则仍然会出现对基类的多次继承

规定:在最后的派生类中不仅要负责对其直接基类进行初始化,还要负责对虚基类初始化

C++编译系统只执行最后的派生类对虚基类的构造函数的调用,而忽略虚基类的其他派生类对虚基类的构造函数的调用,这就保证了虚基类数据成员不会被对此初始化

1 #include <iostream>2 #include <string>3 4 using namespace std;5 6 //声明公共基类Person7 class Person8 {9 public:10     Person(string nam , char se , int a)11     {12         name = nam ; 13         sex = se ;14         age = a ;15     }16 protected:17     string name ; 18     char sex ;19     int age ;20 };21 22 //声明Person的直接派生类Teacher23 class Teacher : virtual public Person    //声明Person为公共继承的虚基类24 {25 public:26     Teacher(string nam , char se , int a , string ti) : Person(nam , se , a) 27     {28         title = ti ;29     }30 protected:31     string title ;32 };33 34 //声明Person的直接派生类Student35 class Student : virtual public Person    //声明Person为公共继承的虚基类36 {37 public:38     Student(string nam , char se , int a , float sco) : Person(nam , se , a) , score(sco) {}39 protected:40     float score ;41 };42 43 //声明多重继承的派生类Graduate44 class Graduate : public Teacher , public Student45 {46 public:47     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) {}48     void show()49     {50         cout << "name :" << name << endl ;51         cout << "sex :" << sex << endl ;52         cout << "age :" << age << endl ;53         cout << "title :" << title << endl ;54         cout << "score :" << score << endl ;55         cout << "wage :" << wage << endl ;56     }57 private:58     float wage ;59 };60 61 //主函数62 int main(void)63 {64     Graduate grad("Wangli" , 'f' , 24 , "assistant" , 89.6 , 2000.6);65     grad.show();66     return 0 ;67 }


在Graduate类中,只保留一份基类的成员,因此可以用Graduate类中的show函数引用Graduate类对象中的公共基类Person的数据成员name , sex , age 的值,不需要加基类名和域运算符 '' :: '' ,不会产生二义性。

原创粉丝点击