c++ - 覆盖返回基类型的函数

标签 c++ inheritance interface abstract-class pure-virtual

我有两个类(class)。基类 Parent 和派生类 ChildParent 类具有返回其类类型的纯虚函数。如何在派生类中覆盖它?

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/

相关文章:

java - 设计模式 - 强制子类的某些行为

Java抽象父级在父级构造函数中初始化子级之前调用子级方法

java - 通用接口(interface): list of something specific

c# - 结构、接口(interface)和装箱

c++ - 捕获 libc 错误消息,从/dev/tty 重定向

c++ - 在库 API 中传递 std::string

c++ - 是否可以使用 GDB 查看未命名的框架/函数参数?

c++ - 如何在Windows中为多台计算机锁定一个文件

java - 在 JPA 中链接不同实体类型的最佳方法

spring - Spring 的外观、服务接口(interface)和事务代理