构造函数中虚函数的奇怪行为

Strange behavior of virtual functions in constructor

本文关键字:函数 构造函数      更新时间:2023-10-16

我已经搜索了有关构造函数中的虚函数的相关问题,我知道如果我们在基类的构造函数中调用虚函数,则只调用virtual的基版本。

然而,我在下面发布的内容显示,在Base构造函数中调用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指针,这是尚未完全构造的对象。如果你在构造函数中调用其他对象的虚方法,它们将完全按预期工作。

我知道如果我们在基类的构造函数中调用虚函数,只调用virtual的基本版本。

你误解了那条规则。

并不意味着从构造函数内部调用虚函数的任何方式。它意味着为正在构造的对象调用虚函数。

在构造函数中,为另一个(完全构造的)对象调用虚函数,该对象的编译时类为B,运行时类为D2。在该对象上,您将获得虚拟函数的D2版本。