我有两个类(class)。基类 Parent
和派生类 Child
。 Parent
类具有返回其类类型的纯虚函数。如何在派生类中覆盖它?
class Parent
{
public:
virtual Parent* OverrideMe(Parent* func) = 0;
};
class Child : public Parent
{
public:
Child* OverrideMe(Child* func) override;
};
我尝试了 Child* OverrideMe(Child* func) override;
但我最终遇到错误,它没有覆盖基类成员。
最佳答案
如果 C++ 具有完整的协变和逆变支持,正确的关系将是输入逆变和输出协变。即:
struct Organism { };
struct Animal : Organism {
virtual Animal* OverrideMe(Animal* ) = 0;
};
struct Dog : Aniaml {
Dog* OverrideMe(Organism* ) override { ... }
↑↑↑ ↑↑↑↑↑↑↑↑
covariant contravariant
};
这似乎有点不直观,但确实有道理。如果您期待的是 Animal*
,您应该能够处理任何属于 Animal*
的东西(Dog*
符合条件)。相反,如果您正在对 Animal*
进行一些操作,您只需要一个可以采用 Animal*
的操作 - 以及一个可以采用 Organism* 的操作
在这方面符合条件。
请注意,如果输入是协变体,则会破坏类型系统。考虑类似的事情;
Animal* a = new Dog;
a->OverrideMe(new Cat);
如果允许 Dog::OverrideMe
带走 Dog*
,那将失败 - Cat*
不是 狗*
!因此,允许使用 Animal*
... 或任何比这更通用的东西(例如 Organism*
),因为所有这些都可以正常工作。
C++ 不在输入中支持逆变,在输出中只支持协变。所以你可以这样写:
Dog* OverrideMe(Animal* ) override { ... }
或:
Animal* OverrideMe(Animal* ) override { .... }
但没有别的。
关于c++ - 覆盖返回基类型的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29523346/