您的位置:首页 > 编程语言 > C语言/C++

C++虚基类

2016-02-16 12:35 369 查看

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在使用多重继承时要十分小心,经常会出现二义性问题,因此许多专业人员认为,不要使用多重继承,能用单一继承解决的问题就不要使用多重继承。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: