C++基类虚函数与基函数指针调用虚函数细节辨析

结果分析:定义类的大小Base和Derived类大小相等,创建Base调用了Base的构造函数输出Base信息。

创建Derived对象时调用Derived构造函数,Derived构造函数中没有显示调用父类Base构造函数,但是创建Derived对象时依然会调用父类base的构造函数,故输出了Base和Derived构造信息。

同样的通过动态分配内存创建Derived对象时也会调用父类构造函数,故输出两条语句,也可以看出父类Base的指针可以指向派生类成员对象。

b调用了f函数,b中的f函数为虚函数,但是有定义可以输出,d对象调用了f函数故输出了派生类的f函数。Base类的指针*pd调用f函数,输出的是父类base的f函数。对象b调用g函数输出base类g信息。对象d调用g函数输出Derived类g信息。Base类的指针*pd调用g函数,输出的是Derived的g函数信息。

Base指针pd指向Derived类对象调用函数顺序,调用时只能匹配base类中存在的函数如f和g函数,虽然f和g函数都是虚函数,派生类Derived的g函数与base类g函数相同的函数特征,此时pd指针调用g函数会迁移至调用派生类Derived的g函数输出的时Derived派生类g函数信息。

但是派生类Derived的f函数参数类型与base函数不相同,故f函数虽然也时虚函数,但是不会迁移至调用Derived类的f函数,根本原因是pd为base指针只能匹配base了f函数参数。

最后结束时调用析构函数注意的时pd只调用base析构函数,因为base中析构函数不是虚函数,不会迁移调用Derived类的析构函数,如果调用Derived析构函数会自动调用父类base析构函数。

测试源代码:

#include   <iostream>
#include   <complex>
using namespace   std;


class Base
{
public:
Base() { cout << "Base-ctor" << endl; }
~Base() { cout << "Base-dtor" << endl; }
virtual void f(int) { cout << "Base::f(int)" << endl; }
virtual void f(double) { cout << "Base::f(double)" << endl; }
virtual void g(int i = 10) { cout << "Base::g()" << i << endl; }
};
class Derived : public Base
{
public:
Derived() { cout << "Derived-ctor" << endl; }
~Derived() { cout << "Derived-dtor" << endl; }
void f(complex<double>) {
cout << "Derived::f(complex)" << endl;
}
void g(int   i = 20) {
cout << "Derived::g()" << i << endl;
}
};
int main()
{
cout << sizeof(Base) << endl;
cout << sizeof(Derived) << endl;


Base b;
Derived d;
Base *pb = new Derived;
b.f(1.0);
d.f(1.0);
pb->f(1.0);
b.g();
d.g();
pb->g();
delete   pb;
return 0;
}




  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值