首页 > 解决方案 > 在具有不同签名的派生类中重载虚拟方法

问题描述

编译器抱怨说,当使用指向 DERIVED 类的指针从另一个类调用时,它无法在 BASE 类中找到正确的函数。

示例(省略构造函数等):

class BASE {
    public: virtual int print(std::vector<double>& values);
};

int BASE::print(std::vector<double>& values){
    std::cout << "This is the base class!" << std::endl;
}
class DERIVED : public BASE {
    public: void virtual print(int a, int b);
};

void DERIVED::print(int a, int b){
    std::cout << "This is the derived class from int-method!" << std::endl;
}
class TEST {
    public: void testit();
};

void TEST::testit(){
    DERIVED derived;
    std::vector<double> a;
    derived.print(a);
}

编译器抱怨TEST.cpp:30:17: error: no matching function for call to ‘DERIVED::print(std::vector<double>&)

如何在派生类中重载具有不同签名的虚函数?例如,这对于添加 BASE 类中不可用的功能可能很有用。

标签: c++overridingvirtual

解决方案


print在 中的DERIVED阴影printBASE,即使签名不同。

要修复,请添加using BASE::print;DERIVED. 注意这一行可以改变继承函数的访问修饰符;如果你希望函数是publicusing ...也必须是public

请注意,您不会在此处覆盖任何函数(通常只有在签名相同的情况下才有可能)。您创建了两个具有相同名称的不相关函数。这意味着virtual可以删除,除非您计划添加更多派生类并实际覆盖其中的函数。


推荐阅读