注意:本文中代码均使用 Qt 开发编译环境
C++ 类型兼容规则###
类型兼容规则是指在需要基类对象的任何地方,都可以使用公有派生类的对象来代替。
通过公有继承,派生类得到了基类中除构造函数和析构函数之外的所有成员。这样,公有派生类实际上就具备了基类的所有功能,凡是基类能解决的问题,公有派生类都可以解决。
类型兼容中所指的替代包括以下几种情况:
1.派生类的对象可以赋值给基类对象。
2.派生类的对象可以初始化基类的引用。
3.派生类对象的地址可以赋值给指向基类的指针。
在替代之后,派生类对象就可以作为基类的对象使用,但是只能使用从基类继承的成员。
示例:
class B{...};
class D:public B{...};
B b1,*pb1;
D d1;
这时:
(1)派生类的对象可以赋值给基类对象。 b1 = d1;
(2)派生类的对象可以初始化基类的引用。 B &bb = d1;
(3)派生类对象的地址可以赋值给指向基类的指针。 pb1 = &d1;
由于类型兼容规则的引入,对于基类及其公有派生类的对象,我们可以使用相同的函数统一处理(因为当函数的形参为基类的对象时,实参可以是派生类的对象),而没有必要为每一个类设计单独的模块,大大提高了程序的效率。
示例:
#include <QCoreApplication>
#include <QDebug>
class B0 {//基类B0声明
public:
void display(){qDebug()<<"B0::display()";} //公有成员函数
};
class B1: public B0 {
public:
void display(){qDebug()<<"B1::display()";}
};
class D1: public B1 {
public:
void display(){qDebug()<<"D1::display()";}
};
void fun(B0 *ptr){
ptr->display(); //"对象指针->成员名"
}
int main()
{
B0 b0; //声明B0类对象
B1 b1; //声明B1类对象
D1 d1; //声明D1类对象
B0 *p; //声明B0类指针
p=&b0; //B0类指针指向B0类对象
fun(p);
p=&b1; //B0类指针指向B1类对象
fun(p);
p=&d1; //B0类指针指向D1类对象
fun(p);
return 0;
}
运行结果:
根据类型兼容规则,我们可以在基类对象出现的场合使用派生类对象进行替代,但是替代之后派生类仅仅发挥出基类的作用。