在基类的构造函数中调用虚函数时为何调用基类的而不是派生类的?

时间:2022-09-08 08:18:40
看如下代码:

#include <stdlib.h>
#include <iostream>

using namespace std;

class Base
{
public:

Base (void)
{
this->func();
}

void callFunc ()
{
this->func();
}


virtual void func ()
{
cout << "Base" << endl;
}

};

class Derived : public Base
{
public:
void func()
{
cout << "Derived" << endl;
}
};


int main()
{
Base* d = new Derived();
d->callFunc();
return 0;
}


派生类重载了基类的虚函数func。在基类中,构造函数和callFunc()函数的内容完全相同,都是调用了func。然而从输出结果或打断点调试来看,当在构造函数中执行func时调用的是基类的,而之后调用callFunc时才调用派生类的。而我想要的是在构造函数里也能根据实际类型去调用相应的函数版本,这为什么做不到?

7 个解决方案

#1


“通过指向派生类的基类指针,访问派生类中同名覆盖成员函数。”

运行时多态。假设有一个虚表,在此基类指针建立后才能去访问这个表。

定义 duixiang
然后 duixiang-〉此表。

#2


虚函数指针在构造函数中初始化,派生类对象先构造基类对象,再构造派生类部分,当构造基类对象的时候,这个派生类对象还不是一个完整的对象,其虚函数指针还没初始化,所以不能够检索虚表去调用对应的虚函数,调用的函数也是这个构造函数(CBase)对应的类里定义的函数(或者其基类定义的函数,比如如果CBase没有定义func,但是CBase的基类有,假如CBase有基类),这里具体说就是基类Base的实现

#3


做不到,派生类还没构造完成,无法调用啊。

#4


标准规定是这样的

#5


明白了。那我想想别的办法,比如需要用到时再调用,未必非要在构造函数中完成。

#6


如果有构造函数
base()
{
init();//基类实现了此方法
initparameter(int,int);//基类实现了此方法
}

派生类构造函数
a:base(){
init();//基类覆盖了此方法
initparameter(int);//基类重写
}

这样基类调用的是基类中的函数 还是派生类中的函数呀

#7


基类构造函数调用的是基类中的函数吗? 那基类中其他函数要是调用init()是基类函数还是派生类函数

#1


“通过指向派生类的基类指针,访问派生类中同名覆盖成员函数。”

运行时多态。假设有一个虚表,在此基类指针建立后才能去访问这个表。

定义 duixiang
然后 duixiang-〉此表。

#2


虚函数指针在构造函数中初始化,派生类对象先构造基类对象,再构造派生类部分,当构造基类对象的时候,这个派生类对象还不是一个完整的对象,其虚函数指针还没初始化,所以不能够检索虚表去调用对应的虚函数,调用的函数也是这个构造函数(CBase)对应的类里定义的函数(或者其基类定义的函数,比如如果CBase没有定义func,但是CBase的基类有,假如CBase有基类),这里具体说就是基类Base的实现

#3


做不到,派生类还没构造完成,无法调用啊。

#4


标准规定是这样的

#5


明白了。那我想想别的办法,比如需要用到时再调用,未必非要在构造函数中完成。

#6


如果有构造函数
base()
{
init();//基类实现了此方法
initparameter(int,int);//基类实现了此方法
}

派生类构造函数
a:base(){
init();//基类覆盖了此方法
initparameter(int);//基类重写
}

这样基类调用的是基类中的函数 还是派生类中的函数呀

#7


基类构造函数调用的是基类中的函数吗? 那基类中其他函数要是调用init()是基类函数还是派生类函数