C 拧紧函数参数类型

C++ tightening function parameter type in subclass

本文关键字:参数 类型 函数      更新时间:2023-10-16

我有一个带有虚拟函数void fnc(XX*)的抽象class A在它的子类(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);
}

你不能。C 中不支持共同变异函数参数类型。

这也不是一般的支持,因为它很容易违反Liskov替代原则。

但是,无论您的代码中发生了什么,您都会超载该功能。您添加了另一个需要覆盖的纯虚拟功能。原始的内容保持不完美,您的编译器抱怨它。