在具有不同签名的派生 class 中重载虚拟方法
Overloading virtual method in derived class with different signature
有
- 一个 BASE class 定义一个虚拟方法
- a DERIVED class 定义了一个同名但签名不同的虚方法
编译器抱怨说,当从另一个 class 使用指向 DERIVED class.
的指针调用时,它无法在 BASE class 中找到正确的函数
示例(省略构造函数等):
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>&)
如何在派生的 classes 中重载具有不同签名的虚函数?例如,这可能有助于添加 BASE class.
中不可用的功能
print
在 DERIVED
中隐藏 print
在 BASE
中,即使签名不同。
要修复,请将 using BASE::print;
添加到 DERIVED
。注意这一行可以改变继承函数的访问修饰符;如果您希望函数为 public
,则 using ...
也必须为 public
.
请注意,您不要在此处覆盖任何函数(usually 只有签名相同时才有可能)。您创建了两个不相关的同名函数。这意味着可以删除 virtual
,除非您计划添加更多派生 类 并实际覆盖其中的函数。
有
- 一个 BASE class 定义一个虚拟方法
- a DERIVED class 定义了一个同名但签名不同的虚方法
编译器抱怨说,当从另一个 class 使用指向 DERIVED class.
的指针调用时,它无法在 BASE class 中找到正确的函数示例(省略构造函数等):
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>&)
如何在派生的 classes 中重载具有不同签名的虚函数?例如,这可能有助于添加 BASE class.
中不可用的功能print
在 DERIVED
中隐藏 print
在 BASE
中,即使签名不同。
要修复,请将 using BASE::print;
添加到 DERIVED
。注意这一行可以改变继承函数的访问修饰符;如果您希望函数为 public
,则 using ...
也必须为 public
.
请注意,您不要在此处覆盖任何函数(usually 只有签名相同时才有可能)。您创建了两个不相关的同名函数。这意味着可以删除 virtual
,除非您计划添加更多派生 类 并实际覆盖其中的函数。