更新时间:2017-08-19 14:09:40浏览次数:1+次
#include <cstdio>
class A
{
public:
void show() { printf("A\n"); }
};
class AA : public A
{
public:
void show() { printf("ShowAA\n"); }
void say() { printf("AA\n"); }
};
class BB : public A
{
public:
void show() { printf("ShowBB\n"); }
void say() { printf("BB\n"); }
};
int main()
{
AA aa;
A a = aa;
a.show();//A
aa.show();//ShowAA
BB bb;
a = bb;
a.show();//A
bb.show();//ShowBB
//a.say();//错误,A没有成员函数say()
return 0;
}
在这一段代码中,我们知道,A是父类(基类),AA和BB是子类(派生类)。AA和BB有一个和A一样的show函数,还有一个额外的say函数。此时,A中的show函数并没有加virtual关键字。所以,AA和BB函数中的show函数并没有构成重载。我们将这种情况称之为覆盖。所以,上述的代码中输出的结果都是自己的类中的show函数的输出。尽管a分别被aa和bb对象赋值,但是a对象的show依然保持本色。很快你会发现,A类中的show函数并没有被定义为virtual,所以AA和BB类并不会重载show函数。按照继承的说法,确实如此。那么如果加上virtual关键字,就可以逆转对象赋值来改变对象吗??不会的!!对象还是对象,不管类如何定义重载,都不能因为对象的赋值而改变了对象的特性的。那么virtual重载又是怎么回事呢???是不是有点懵逼了????我们后面再深入分析。
总结一下,子类对象赋值给父类对象,是一个冗余信息的交付;而父类对象赋值给子类对象,是一个信息不足的交付。对于信息不足,自然是不允许直接交付的。所以在语法上,子类可以赋值给父类,而父类却不可以赋值给子类。
更多内容,请看后续的系列文章。。。。
相关资讯