如何避免在 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++ 中调用祖父构造函数?的主要内容,如果未能解决你的问题,请参考以下文章