【问题标题】:Strange behavior of virtual functions in constructor构造函数中虚函数的奇怪行为
【发布时间】:2015-11-02 15:32:43
【问题描述】:

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

但是,我在下面发布的内容表明,在 Base 构造函数中调用 virtual 实际上调用了 D2 中的虚拟版本。

我知道它可能看起来有点重复,但我想知道是否有人帮助我。

我的代码:

#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()this-&gt;fun() 不同。

标签: c++ constructor virtual


【解决方案1】:

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

你误解了这条规则。

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

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

【讨论】:

    【解决方案2】:

    因为您调用b.fun(),所以b 是现有的完全构造的对象。如果您在尚未完全构造的对象的this 指针上调用它们,则虚拟方法不能以虚拟方式工作。如果您在构造函数上调用其他对象的虚方法,它们将完全按预期工作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-10
      相关资源
      最近更新 更多