gpt4 book ai didi

c++ - 有没有办法使用 using 声明来解决 "final overrider ambiguity"?

转载 作者:搜寻专家 更新时间:2023-10-31 01:27:00 24 4
gpt4 key购买 nike

我正在尝试用虚拟类方法解决一个可怕的菱形继承(钻石问题)。

让我们首先考虑具有最终虚方法特性的多重继承情况。由于存在 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’

关于如何解决这个问题有什么想法吗?

最佳答案

这是告诉您设计错误的语言。它是。继承反射(reflect)了一种“is-a”关系。不是“有”。

解决方案是使用组合而不是继承。我会举一个例子,但完全不清楚您实际打算完成什么,也想不出任何合理的例子。

关于c++ - 有没有办法使用 using 声明来解决 "final overrider ambiguity"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54257546/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com