有没有一种方法可以使用using声明来解决“最终重写器歧义”?

时间:2019-01-18 16:05:18

标签: c++ abstract-class multiple-inheritance using virtual-functions

我正在尝试使用虚拟类方法解决可怕的钻石问题。

让我们首先考虑一个具有最终虚拟方法特性的多重继承案例。 由于存在最后一种方法,因此不能声明覆盖方法,而必须使用using-声明来指定子类应使用哪种方法。

class Mother {
public:
    virtual void foo() final {}
};

class Father {
public:
    virtual void foo() {}
};

class Child: public Mother, public Father {
public:
    // void foo() {Mother::foo();} // This clashes with Mother::foo being final
    using Mother::foo;
};

上面的代码按预期工作。

但是,如果我们切换到具有抽象基类的菱形结构,则相同的方法将不再起作用。

class GrandParent {
public:
    virtual void foo() = 0;
};

class Mother: virtual public GrandParent{
public:
    virtual void foo() override final {};
};

class Father: virtual public GrandParent{
public:
    virtual void foo() override {};
};

class Child: public Mother, public Father {
    using Mother::foo;
};

编译以上代码将引发错误:no unique final overrider for ‘virtual void GrandParent::foo()’ in ‘Child’

关于如何解决此问题的任何想法?

1 个答案:

答案 0 :(得分:3)

这是告诉您设计错误的语言。是的。继承反映了“是”关系。不是“有”。

解决方案是使用组合而不是继承。我会举一个例子,但目前尚不清楚您实际上打算完成什么,并且无法想到任何明智的例子。