class A
{
public:
...
virtual bool Function(..) const {...}
}
class B : public A
{
public:
...
virtual bool Function(..) const {...}
}
class OtherClass
{
public:
OtherClass(A& a)
{
m_bool = a.Function(..);
}
private:
bool m_bool;
}
假设类A或类B在构造类OtherClass之前完全初始化。
问题>在OtherClass的构造函数中调用虚函数是否有问题?
最佳答案
没有,怎么会有问题呢? A
的实例(通过引用)传递给 OtherClass
的构造函数已经完全初始化,因此其上的虚函数按预期工作。
您听到的警告是关于在其构造函数中调用您正在构造的对象的虚函数;在这种情况下,虚拟调度被禁用,即在每个基类的构造函数中调用的虚函数版本是构造函数正在运行的基类之一。
这个想法是,在基类构造函数中,对象还没有变成它的最终类型;换句话说,当您构造一个从某个基类继承的对象时,它从“最基本”类型开始,并在每个派生类构造函数运行时转换为派生类型。这反射(reflect)了各种构造函数在运行时看到的虚函数版本。
您可以阅读更多详细信息 here .
同样,这不会影响传递给构造函数的任何对象,因为它们已经完全构造,所以它们的“最终类型”(以及相应的虚函数集)已经完全成立。
关于c++ - 在当前类的构造函数中调用其他类定义的虚函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13806193/