如何多次继承同一个类?

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&lt;a&gt; 继承,所以你可以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 大型程序工具)虚继承

第二十四天继承:

Java 继承

Thread和Runnable的区别和联系多次start一个线程会怎么样

同一个类函数的多个定义取决于同一个继承类的多个类型?

继承关系中的父子类构造方法的特点