c++ - 在具有不同签名的派生类中重载虚拟方法
问题描述
有
- 定义虚方法的 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 类中不可用的功能可能很有用。
解决方案
print
在 中的DERIVED
阴影print
中BASE
,即使签名不同。
要修复,请添加using BASE::print;
到DERIVED
. 注意这一行可以改变继承函数的访问修饰符;如果你希望函数是public
,using ...
也必须是public
。
请注意,您不会在此处覆盖任何函数(通常只有在签名相同的情况下才有可能)。您创建了两个具有相同名称的不相关函数。这意味着virtual
可以删除,除非您计划添加更多派生类并实际覆盖其中的函数。
推荐阅读
- puppeteer - Puppeteer:无法选择非锚元素
- java - 无法在 Java 中找到和读取文件
- powershell - 仅对机械硬盘进行分区和格式化
- php - 填充对象数组而不每次都创建新对象
- javascript - 有没有办法强制特定的 dataTable 列在移动设备上显示?
- android - FCM 未发送通知
- python - 使用 exchangelib 更改发件人帐户
- pandas - 我想知道如何从两个不同的列中获取具有 2 个特定值的行
- mongodb - 猫鼬增量动态对象
- c# - 用于创建新 blob 容器的 Powershell 脚本不适用于 Azure 存储模拟器