如何避免在 C++ 中调用祖父构造函数?

Posted

技术标签:

【中文标题】如何避免在 C++ 中调用祖父构造函数?【英文标题】:How do you avoid calling a grandparent constructor in C++? 【发布时间】:2010-12-19 10:37:01 【问题描述】:

下面代码中的 Child 构造函数调用其父构造函数来初始化自己。然而,除非 Child 也调用 Grandparent 构造函数,否则代码不会编译,即使这是一个应该隐藏在 Parent 中的实现细节。我不想将这个细节暴露给 Child 类的用户,因为它将来可能会改变。我怎样才能让下面的代码工作?

我尝试将继承更改为“私有”,但仍希望 Child 构造函数知道这种私有安排,恕我直言,这在某种程度上违背了私有继承的目的!

有什么建议吗?

#include <iostream>

class MyObject 
  public:
    MyObject(int i) 
      std::cout << "MyObject(" << i << ") constructor" << std::endl;
    
;

class Grandparent 
  public:
    Grandparent(MyObject i)
    
    ;
;

class Parent: virtual public Grandparent 
  public:
    Parent(int j) :
      Grandparent(MyObject(j))
    
    ;
;

class Child: virtual public Parent 
  public:
    Child() :
      //Grandparent(MyObject(123)),  // Won't work without this
      Parent(5)
    
    ;
;

int main(void)

  Child c;
  return 0;

$ g++ -o test test.cpp
test.cpp:在构造函数“Child::Child()”中:
test.cpp:29:错误:没有匹配函数调用‘Grandparent::Grandparent()’
test.cpp:12:注意:候选人是:祖父母::祖父母(MyObject)
test.cpp:10: 注意:祖父母::祖父母(const Grandparent&)

【问题讨论】:

gcc c++ virtual inheritance problem的可能重复 【参考方案1】:

这是因为继承是虚拟的。虚拟继承永远不能成为实现细节,因为 Child 类必须管理任何多重继承类的实例。如果您使用普通继承,那么这应该不是问题。

【讨论】:

这似乎是问题所在 - 谢谢!关于为什么会这样的任何指示/推理?? @Malvineous, This article 是我设法找到的最佳解释。基本上是为了确保即使在多重继承的情况下,虚拟基构造函数也只会被调用一次(由最派生的类,在正常的构造函数链之外)。【参考方案2】:

删除虚拟继承后它对我来说很好。

【讨论】:

以上是关于如何避免在 C++ 中调用祖父构造函数?的主要内容,如果未能解决你的问题,请参考以下文章

C++在构造函数中调用最终的虚函数

如何让 PHP 类构造函数调用其父级的父级构造函数?

在c++中如何调用数组对象的构造函数

如何避免在基类初始化程序中调用默认构造函数?

C++中explicit关键字

C++中如何在子类的构造函数中调用基类的构造函数来初始化基类成员变量