在调用非虚拟成员时消除基类的歧义

时间:2017-09-29 13:59:52

标签: c++ c++14 multiple-inheritance

考虑以下继承层次结构:

struct Top {
    void foo();
    virtual void bar() = 0;
};

struct Mid1: Top {
    virtual void bar() override { }
};
struct Bot1: Mid1 { };

struct Mid3: Top {
    virtual void bar() override { }
};

struct Bot3: Mid3, private Bot1 {
    using Mid3::bar;
    using Mid3::foo;
};

以下代码段:

Bot3 b;
b.foo(); // does not compile
b.bar(); // compile

错误是:

  

test.cpp:28:5:错误:从派生类'Bot3'到基类'Top'的模糊转换:

struct Bot3 -> struct Mid3 -> struct Top

struct Bot3 -> struct Bot1 -> struct Mid1 -> struct Top

b.foo();
^

是否有一种简单的方法可以告诉编译器使用第一个“转换”序列? using Mid3::foo;此处没有效果(标准行为)。

我知道我可以在foo()中定义Bot3并简单地调用Mid3::foo(),但如果可能,我想避免这种情况。

2 个答案:

答案 0 :(得分:1)

不明确的情况含糊不清。 C ++不允许你将“第一”优先考虑;你必须每次都明确地消除这种呼叫的歧义。

或者只是在派生类中创建一个函数,该函数转发到正确的基类函数。

答案 1 :(得分:1)

在这种情况下,您可以通过让它知道它应该继承哪个继承树的分支来调用您的基类方法,给编译器一些帮助。

int main(int argc, char* argv[]) {
    Bot3 b;
    static_cast<Mid3*>(&b)->foo();
    return 0;
}