【问题标题】:C++ tightening function parameter type in subclass子类中的 C++ 紧缩函数参数类型
【发布时间】:2017-04-27 04:28:24
【问题描述】:

我有一个抽象 class A 和一个虚函数 void fnc(XX*) 在它的子类(class B)中,我想收紧函数参数类型(我希望这是正确的词),所以 fnc 只接受YY*,它是XX 的子类。

它不起作用,因为我收到此错误:

invalid new-expression of abstract class type 'C'
because the following virtual functions are pure within 'C':
virtual void A::fnc(XX*)

代码:

// Example program
#include <iostream>
#include <string>

class XX {};

class YY : public XX {};

class A {
public:
    virtual void fnc(XX*) = 0;
};

class B : public A {
public:
    virtual void fnc(YY*) = 0;
};

class C : public B {
public:
    virtual void fnc(YY*) override {
        std::cout << "test" << std::endl;
    }
};

int main() {
    YY* yy = new YY();
    C* cc = new C();

    cc->fnc(yy);
}

【问题讨论】:

  • 如果允许的话,A 的界面就会撒谎。一个说谎的界面对任何人都没有用。

标签: c++ class inheritance interface


【解决方案1】:

你不能。 C++ 不支持协变函数参数类型。

一般来说它也不是很受支持,因为它很容易违反 Liskov 替换原则。

但无论如何,您的代码中发生的事情是您重载了函数。您添加了另一个需要重写的纯虚函数。原来的那个仍未实现,你的编译器会抱怨它。

【讨论】:

    猜你喜欢
    • 2014-12-16
    • 1970-01-01
    • 1970-01-01
    • 2012-09-04
    • 1970-01-01
    • 1970-01-01
    • 2021-10-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多