本章介绍菱形继承、虚继承和类型适应。
1、菱形继承与虚继承
在多继承中,可能会发生多个父类共基类的问题,即菱形继承。
例如:
解决办法:
父类继承基类时使用虚继承,在继承前加virtual,即:虚继承。
虚继承:
使共同基类只产生一个拷贝,只对第一个调用有效,对其他派生类都是虚假的,没有调用构造函数。
举例:
D继承自B和C,B类继承A类,C类也继承A类
#include<iostream>
using namespace std;
class A
{
public:
int a;
void show()
{
cout << "我是基类Dshow" << endl;
}
};
class B:virtual public A
{
};
class C:virtual public A
{
};
class D:public B,public C
{
};
int main()
{
D obj;
obj.show();
return 0;
}
不加virtual会报错:[Error] request for member 'show' is ambiguous
2、类型适应
派生类的对象、指针、引用适用于基类对象、指针、引用
可以将子类的对象 、指针 、 引用 赋值给 基类的对象、指针、引用
举例:
#include<iostream>
using namespace std;
class A
{
public:
int xp;
A(int x=0)
{
xp = x;
}
void show()
{
cout << "xp" << xp << endl;
}
};
class B:public A
{
public:
int yp;
B(int x=0,int y=0):A(x)
{
yp = y;
}
void show()
{
cout << "xp:" << xp << ",yp" << yp << endl;
}
};
int main()
{
A a(5);
B b(1,5);
a.show();
b.show();
// 基类的对象 = 子类的对象
a = b;
a.show(); // 基类的对象只能调用基类的show函数
// 使用基类的指针 指向子类对象
A *t = &b;
t->show(); // 基类的指针只能调用基类的show函数
// 基类的引用 引用子类的对象
A &k = b;
k.show(); // 基类的引用只能调用基类的show函数
return 0;
}