c++ - 消除c++中菱形继承(钻石问题)访问顶级成员的歧义

标签 c++ language-lawyer multiple-inheritance

首先我想承认有 many questions with similar titles和主题。我相当确定我的产品在他们中是独一无二的。

给定代码

struct Top {
    int get() {
        return 0;
    }
};

struct Mid1 : Top {
    int get() {
        return 1;
    }
};

struct Mid2 : Top {
    int get() {
        return 2;
    }
};

struct Bottom : Mid1, Mid2 {

};

int main(int argc, char ** argv) {
    Bottom b;
    std::cout << b.Mid1::get();
    std::cout << b.Mid2::get()
    std::cout << b.Top::get();
}

我在尝试访问 Top::get() 时遇到错误(使用 gcc mingw-w64)

 error: 'Top' is an ambiguous base of 'Bottom'
 std::cout << b.Top::get();

我收到一个错误。在这种情况下,如何向编译器发出信号以在特定继承路径上调用 Top::get

最佳答案

底部derived class没有使用 virtual inheritance ,因此它有 2 个不同的 Top 实例 - 一个继承自 Mid1,另一个继承自 Mid2。因此,您必须明确告诉编译器您要从哪个 Top 实例调用 get(),例如:

std::cout << b.Mid1::get(); // OK
std::cout << b.Mid2::get(); // OK
std::cout << b.Top::get(); // ERROR!
std::cout << b.Mid1::Top::get(); // ERROR!
std::cout << b.Mid2::Top::get(); // ERROR!
std::cout << static_cast<Mid1&>(b).Top::get(); // OK
std::cout << static_cast<Mid2&>(b).Top::get(); // OK

Live Demo

关于c++ - 消除c++中菱形继承(钻石问题)访问顶级成员的歧义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51993468/

相关文章:

javascript - ECMAScript 规范中的 `new Object` 与 `Object`

c++ - 模板、接口(interface)(多重继承)和静态函数(命名构造函数)

c++ - 类的对象(使用单/多继承)有多少个 vptr?

c++ - 如何删除 C++ 中的 "end of non-void function"错误?

C++ -- 关于 typedef 的问题

c++ - 什么是 __kernel_vsyscall?

c++ - 具有未定义行为但从未实际执行过的表达式是否会使程序出错?

c++ - 在没有模板参数的派生类中使用模板类名是否合法?

javascript - JavaScript 中的多重继承

c++ - 指向模板函数的指针