构造函数中虚函数的奇怪行为
Strange behavior of virtual functions in constructor
我搜索了构造函数中虚函数的相关问题,我知道如果我们在基础class的构造函数中调用虚函数,只会调用基础版本的virtual。
但是我下面post说明在Base constructor中调用virtual实际上调用的是D2中的virtual版本
我知道它可能看起来有点重复,但我想知道是否有人帮助我。
我的代码:
#include<iostream>
struct B
{
B()=default;
B(const B& b) {b.fun();}
virtual void fun()const {std::cout<<"virtual_B"<<std::endl;}
};
struct D1:public B
{
D1()=default;
D1(const D1& d1):B(d1) {}
void fun()const {std::cout<<"virtual_D1"<<std::endl;}
};
struct D2:public D1
{
D2()=default;
D2(const D2& d2):D1(d2) {}
void fun()const {std::cout<<"virtual_D2"<<std::endl;}
};
int main()
{
D2 a;
D2 b=a;
return 0;
}
因为你调用了b.fun()
,b
是现有的完全构造的对象。如果您在尚未完全构造对象的 this
指针上调用虚拟方法,则虚拟方法将无法以虚拟方式工作。如果您在构造函数上调用其他对象的虚方法,它们将完全按预期工作。
I know that if we call virtual functions in constructor in base class,
only the base version of virtual is invoked.
你误解了这条规则。
这并不意味着从构造函数中调用虚函数的任何方式。意思是调用正在构造的对象的虚函数
在构造函数中,您为编译时间 class 为 B 且运行时间 class 为 D2 的另一个(完全构造的)对象调用了虚函数。在那个对象上你得到了虚函数的 D2 版本。
我搜索了构造函数中虚函数的相关问题,我知道如果我们在基础class的构造函数中调用虚函数,只会调用基础版本的virtual。
但是我下面post说明在Base constructor中调用virtual实际上调用的是D2中的virtual版本
我知道它可能看起来有点重复,但我想知道是否有人帮助我。
我的代码:
#include<iostream>
struct B
{
B()=default;
B(const B& b) {b.fun();}
virtual void fun()const {std::cout<<"virtual_B"<<std::endl;}
};
struct D1:public B
{
D1()=default;
D1(const D1& d1):B(d1) {}
void fun()const {std::cout<<"virtual_D1"<<std::endl;}
};
struct D2:public D1
{
D2()=default;
D2(const D2& d2):D1(d2) {}
void fun()const {std::cout<<"virtual_D2"<<std::endl;}
};
int main()
{
D2 a;
D2 b=a;
return 0;
}
因为你调用了b.fun()
,b
是现有的完全构造的对象。如果您在尚未完全构造对象的 this
指针上调用虚拟方法,则虚拟方法将无法以虚拟方式工作。如果您在构造函数上调用其他对象的虚方法,它们将完全按预期工作。
I know that if we call virtual functions in constructor in base class, only the base version of virtual is invoked.
你误解了这条规则。
这并不意味着从构造函数中调用虚函数的任何方式。意思是调用正在构造的对象的虚函数
在构造函数中,您为编译时间 class 为 B 且运行时间 class 为 D2 的另一个(完全构造的)对象调用了虚函数。在那个对象上你得到了虚函数的 D2 版本。