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;
}




猜你喜欢

转载自blog.csdn.net/weixin_41384823/article/details/80704197