C++虚基类

来源:互联网 发布:小说改编的网络剧大全 编辑:程序博客网 时间:2024/06/05 18:45

C++虚基类

1.1虚基类的作用:
如果一个派生类有多个直接基类,而且这些直接基类又有一个共同的基类,则在最终的派生类中会保留该间接共同基类的多份同名成员。所以为了解决这个问题,C++提供虚基类的方法,使得在继承间接共同基类时只保留一个成员。
1.2虚基类并不是在声明基类时声明的,而是在声明派生类时,指定继承方式时声明的,因为一个基类可以在生成一个派生类时,作为虚基类,在生成另个派生类时,不作为虚基类。
1.3为了 保证虚基类在派生类中只继承一次,应当在该基类的所有直接基类中声明为虚基类。

虚基类的初始化

1.1如果在虚基类中定义了有参数的构造函数,而且没有定义默认构造函数,则在其所有派生类(包括直接和间接)中,通过构造函数的初始化表对虚基类进行初始化。
1.2在最后的派生类中不仅要负责对其直接基类进行初始化,还要负责对虚基类进行初始化。
1.3C++编译系统只执行最后的派生类对虚基类的构造函数的调用,而忽略虚基类的其他派生类(如类B和类C)对虚基类的构造函数的调用,这就保证了虚基类的数据成员不会被多次初始化。
1.4一段代码:

 #include <iostream>
using namespace std;
class Person
{
public:
    Person(char* n,int a):name(n),age(a){}
protected:
    char* name;
    int age;
};
class Teacher:virtual public Person
{
public:
    Teacher(char* n,int a,char* t):Person(n,a),title(t){}
protected:
    char* title;
};
class Student:virtual public Person
{
public:
    Student(char* n,int a,float sco):Person(n,a),score(sco){}
protected:
    float score;
};
class Grudate:public Teacher,public Student
{
public:
    Grudate(char* n,int a,char* t,float sco,float w):Person(n,a),Student(n,a,sco)
      ,Teacher(n,a,t),wage(w){}
    void show()
    {
        cout << "name: " << name << endl;
        cout << "age: " << age << endl;
        cout << "score: " << score << endl;
        cout << "title: " << title << endl;
        cout << "wage: " << wage << endl;
    }
private:
    float wage;
};
int main()
{
    Grudate grud("shukai",20,"good",100,9999);
    grud.show();
    return 0;
}

1.5在使用多重继承时要十分小心,经常会出现二义性问题,因此许多专业人员认为,不要使用多重继承,能用单一继承解决的问题就不要使用多重继承。

1 0
原创粉丝点击