虚函数实例分析
前言
今天c++实验让我们分析下列程序的输出
代码与运行结果
1 |
|
分析
内存大小我也不是很清楚是如何计算的,但是后续输出大概搞懂了
定义基类对象b:调用基类构造函数
定义派生类对象d:先调用基类构造函数,再调用派生类构造函数
定义基类指针指向派生类对象:实际上就是创建了一个派生类对象,同样是先调用基类构造函数,再调用派生类构造函数
b.f(1.0):调用基类的f(double)
d.f(1.0):优先匹配派生类对象的函数,符合complex类型(复数类,如果只输入一个值,默认作为实部),调用派生类的f(complex)
pb->f(1.0):pb为基类指针,f为虚函数但是1.0优先匹配double->调用基类的f(double),如果删除基类的f(double)就会调用派生类的f(complex)
b.g():调用基类的g(int),未指定值默认输出10
d.g():调用派生类的g(int),未指定值默认输出20
pb->g():这个我只是勉强可以理解,但是具体原理我也不太明白,pb为基类指针,g()为虚函数,如果派生类的该同名函数与基类的该函数在参数(个数与数据类型)上完全一致的话,程序会选择执行派生类的该函数并将基类的该函数的形参值赋给派生类的相应形参;如果派生类的该同名函数与基类的该函数在参数(个数与数据类型)上并非完全一致,则直接执行基类的该函数
delete pb:这个很容易判断出错,注意看这个程序对基类析构函数的定义:不是虚析构函数!!!因此虽然定义了一个派生类指针但是却只会执行基类析构函数
如果是使用系统默认析构函数的话,会一并析构基类与派生类,因为系统定义的析构函数是虚析构函数,因此可以执行到派生类的析构函数,所以我们如果自己要定义析构函数,推荐都定义为虚析构函数,即
virtual ~Base() {}
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 快乐小凳凳!
评论