具有
- 定义虚拟方法的BASE类
- 定义具有相同名称但不同签名的虚拟方法的DERIVED类
当使用指向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类中不可用的功能。
DERIVED
中的print
在BASE
中遮蔽print
,即使签名不同。
要修复此问题,请将using BASE::print;
添加到DERIVED
中。请注意,这一行可以更改继承函数的访问修饰符;如果希望函数为public
,则using ...
也必须为public
。
请注意,这里不覆盖任何函数(通常只有在签名相同的情况下才可能覆盖(。您创建了两个同名的不相关函数。这意味着virtual
可以被删除,除非您计划添加更多的派生类并实际覆盖其中的函数。