如何解决在具有不同签名的派生类中重载虚拟方法
拥有
- 定义虚拟方法的BASE类
- 一个DERIVED类,该类定义了一个具有相同名称但签名不同的虚拟方法
编译器抱怨说,当另一个类使用指向DERIVED类的指针从BASE类中调用时,无法在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类中不可用的功能可能很有用。
解决方法
即使签名不同,在{{1}中的
print
阴影DERIVED
中的 print
。
要解决此问题,请将BASE
添加到using BASE::print;
。请注意,此行可以更改继承函数的访问修饰符。如果您希望函数为DERIVED
,则public
也必须为using ...
。
请注意,您不会在此处覆盖任何功能(usually仅在签名相同的情况下才有可能)。您使用相同的名称创建两个不相关的函数。这意味着public
可以删除,除非您计划添加更多派生类并实际覆盖其中的函数。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。