如何多次继承同一个类?
Posted
技术标签:
【中文标题】如何多次继承同一个类?【英文标题】:How to inherit same class multiple times? 【发布时间】:2021-05-22 14:34:51 【问题描述】:是否可以像这样继承两个相同的类?我能够在 msvc 上编译它,但在 g++/clang++ 上编译失败。我收到错误:
Source.cpp:14:12: warning: direct base 'a' is inaccessible due to ambiguity:
struct b -> struct a
struct b -> class_combiner<struct a> -> struct a [-Winaccessible-base]
struct b : public a, public class_combiner<a>
^~~~~~~~
Source.cpp:17:12: error: ambiguous conversion from derived class 'b' to base class 'a':
struct b -> struct a
struct b -> class_combiner<struct a> -> struct a
a::f();
来源:
template <typename T>
struct class_combiner : public T
using T::T;
;
struct a
void f()
;
struct b : public a, public class_combiner<a>
void f2()
a::f();
b::class_combiner::f();
;
int main()
b x;
x.f2();
【问题讨论】:
如果你这样做,你在b
中有两个a
实例。对于这种“钻石继承”模式,请考虑改用虚拟继承(那么将只有一个 a
实例)。
我遇到了同样的问题,并通过电话与 Bjarne Stroustrup 交谈。他建议创建一个辅助结构来帮助作为鉴别器,struct a_helper : a ;
。并从struct b : public a_helper, public class_combiner<a>
继承,所以你可以a_helper::a::f();
,否则会有歧义。假设您不希望 a
基础对象与 a
基础对象完全相同。
谢谢@Eljay 这似乎成功了。我会发布答案,以防有人遇到同样的事情。
【参考方案1】:
我想出的可行的快速修复:
template <typename T, unsigned int instance>
struct class_combiner : public T
using T::T;
;
struct a
void f()
;
struct b : public class_combiner<a, 0>, public class_combiner<a, 1>
void f2()
class_combiner<a, 0>::f();
class_combiner<a, 1>::f();
;
int main()
b x;
x.f2();
【讨论】:
以上是关于如何多次继承同一个类?的主要内容,如果未能解决你的问题,请参考以下文章
C++ Primer 5th笔记(chap 18 大型程序工具)虚继承