【发布时间】:2019-06-12 22:18:12
【问题描述】:
我正在尝试用虚拟类方法解决一个可怕的菱形问题。
让我们首先考虑一个具有最终虚方法特性的多重继承情况。 由于存在 final 方法,因此无法声明覆盖方法,而必须使用 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’。
关于如何解决这个问题的任何想法?
【问题讨论】:
-
这可能会有所帮助;如果子类的虚函数声明与基类声明不匹配,override 用于生成编译器错误。 final 关键字通常用于表示您不能从这样的类派生。
标签: c++ abstract-class multiple-inheritance using virtual-functions