int main() { C c1; c1.a=3; c1.display(); }
如果虚基类中定义了带参数的构造函数,而且没有定义默认构造函数,则在其所有派生类(包括直接派生或间接派生的派生类)中,通过构造函数的初始化表对虚基类进行初始化。
#include
public: int a; void display(){cout<<\ N(int i){a=i;} };
class A:virtual public N {
public: int a1; void display(){cout<<\ A(int i):N(i){} };
class B:virtual public N {
public: int a2; void display(){cout<<\ B(int i):N(i){} };
class C:public A,public B {
public: int a3; void display(){cout<<\ C(int i):N(i),A(i),B(i){} };
int main() { C c1(10); c1.a=3; c1.display();
}
下面我们来看一个比较实际的例子
//例5.8 声明一个教师(Teacher)类和一个学生(Student)类,用多重继承的方式声明一个研究生(Graduate)派生类。教师类中包括数据成员name(姓名)、age(年龄)、title(职称)。学生类中包括数据成员name1(姓名)、age(性别)、score(成绩)。在定义派生类对象时给出初始化的数据,然后输出这些数据。 #include
class Teacher //声明类Teacher(教师) {
public: //公用成员 Teacher(string nam,int a, string t) //构造函数 {name=nam; age=a; title=t;}
void display( ) //输出教师有关数据 {cout<<\ cout<<\ cout<<\ }
protected: //保护成员
string name; int age; string title; //姓名、年龄、职称 };
class Student //定义类Student(学生) {
public:
Student(string nam,char s,float sco) {
name1=nam; sex=s; score=sco;} //构造函数 void display1( ) //输出学生有关数据 {cout<<\ cout<<\ cout<<\ }
protected: //保护成员
string name1; char sex; float score; //姓名、性别、成绩 };
class Graduate:public Teacher,public Student //声明多重继承的派生类Graduate {public:
Graduate(string nam,int a,char s, string t,float sco,float w): //构造函数 Teacher(nam,a,t),Student(nam,s,sco),wage(w) { }
void show( ) //输出研究生的有关数据 {cout<<\ cout<<\ cout<<\
cout<<\ cout<<\ cout<<\ } private:
float wage; //工资 };
int main( )
{Graduate grad1(\ grad1.show( ); return 0; }
试想一下,如果将类Student中的name1改成name,程序会怎么样?那么在Graduate中的name就会出现二义性。怎么办?那就是定义一个虚基类Person,该类中存放共有的成员。
//例5.9 增加一个虚基类来解决二义性问题 #include
class Person {
public: Person(string nam,char s,int a) { name=nam;sex=s;age=a; } protected: string name; char sex; int age; };
class Teacher:virtual public Person //声明类Teacher(教师) {
public: //公用部分 Teacher(string nam,char s,int a, string t):Person(name,s,a) //构造函数 {title=t; }
protected: //保护部分 string title; //职称 };
class Student:virtual public Person //定义类Student(学生) {
public: Student(string nam,char s,int a,float sco):Person(nam,s,a) { score=sco;} //构造函数
protected: //保护部分 float score; //成绩 };
class Graduate:public Teacher,public Student //声明多重继承的派生类Graduate {
public:
Graduate(string nam,int a,char s, string t,float sco,float w): Person(nam,s,a),Teacher(nam,s,a,t),Student(nam,s,a,sco) {wage=w; }
void show( ) //输出研究生的有关数据 {cout<<\ cout<<\ cout<<\ cout<<\ cout<<\ cout<<\ } private:
float wage; //工资 };
int main( )
{Graduate grad1(\ grad1.show( ); return 0; }
阅读以下程序,比较一下虚基类与非虚基类的差别 #include
public: Base(int i){cout<<\ \};
//============================================= class Derived11:virtual public Base {
public: Derived11(int i,int j):Base(i){cout<<\ \};
//============================================= class Derived12:virtual public Base {
public: Derived12(int i,int j):Base(i){cout<<\ \
};
//============================================== class Derived2:public Derived11,public Derived12 {
public: Derived2(int i,int j,int k,int l,int n):Derived12(k,l),Derived11(i,j),Base(i) { cout<<\ \};
//============================================== int main() { Derived2 obj(1,2,3,4,5); return 0; }
运行结果:Base 1
Derived11 2 Derived12 4 Derived2 5
如果是非虚基类,将以上程序中的红色部分删除,运行结果如下: Base 1
Derived11 2 Base 3
Derived12 4 Derived2 5
Press any key to continue
5.7 基类与派生类的转换
不同类型数据之间在一定条件下可以进行类型的转换,这种不同类型数据之间的自动转换和赋值,称为赋值兼容。
基类与派生类对象之间是否也有赋值兼容的关系?可以的。由于派生类中包含从基类继承的成员,因此可以将派生类的值赋给基类对象,在用到基类对象时可以用子类对象代替。
? 派生类对象可以向基类对象赋值 #include class Rectangle:public Point 百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说综合文库第5章 继承与派生(8)在线全文阅读。
相关推荐: