c++ - 虚拟继承:没有匹配的调用函数
问题描述
我有以下代码。此代码的目的是
#include <stdio.h>
#include <iostream>
struct A {
public:
virtual void m1(){
std::cout << "A virtual void m1"<<std::endl;
}
void m1(int a){
std::cout << "A void m1(int)"<<std::endl;
}
virtual void m2(){
std::cout << "A virtual void m2()"<<std::endl;
}
void m3(int a){
std::cout << "A void m3(int)"<<std::endl;
}
};
struct B: virtual A{
public:
B():A(){}
virtual void m1(){
std::cout <<"B virtual void m1()" <<std::endl;
}
virtual void m2(int a){
std::cout << "B virtual void m2(int a)"<<std::endl;
}
void m3(){
std::cout <<"B void m3" <<std::endl;
}
virtual void m4(){
std::cout <<"B void m4()" <<std::endl;
}
};
int main() {
B* b = new B;
b->m1();
b->m1(1);
b->m2();
b->m3(1);
return 0;
}
当我尝试编译所述代码时,出现以下错误:
$ c++ virtual.cpp
virtual.cpp: In function ‘int main()’:
virtual.cpp:90:12: error: no matching function for call to ‘B::m1(int)’
b->m1(1);
^
virtual.cpp:21:18: note: candidate: ‘virtual void B::m1()’
virtual void m1(){
^~
virtual.cpp:21:18: note: candidate expects 0 arguments, 1 provided
virtual.cpp:91:11: error: no matching function for call to ‘B::m2()’
b->m2();
^
virtual.cpp:24:18: note: candidate: ‘virtual void B::m2(int)’
virtual void m2(int a){
^~
virtual.cpp:24:18: note: candidate expects 1 argument, 0 provided
virtual.cpp:92:12: error: no matching function for call to ‘B::m3(int)’
b->m3(1);
^
virtual.cpp:27:10: note: candidate: ‘void B::m3()’
void m3(){
^~
virtual.cpp:27:10: note: candidate expects 0 arguments, 1 provided
在阅读了有关虚函数的信息后,例如,我希望我的调用b->m1(1)
能够解决,B::m2(int a)
但显然我的代码是错误的。
我怀疑我没有正确初始化父结构,但除了我不知道我做错了什么之外。
解决方案
在 C++ 中重载继承的函数时,同名的基类函数会被隐藏。隐藏的基类函数不能像类函数那样调用或者不是隐藏的继承函数,你需要明确告诉编译器你要使用隐藏函数。
你这样做写下定义你想要使用的函数的类:theRightClass::ambiguousFunction();
在您的代码中,主要功能变为:
int main() {
B* b = new B();
b->m1();
b->A::m1(1);
b->A::m2();
b->A::m3(1);
delete b;
return 0;
}
推荐阅读
- java - 无法从数据库spring boot中检索数据
- vb.net - VB.Net战争游戏
- excel - 遍历子目录并打开这些目录中的文件
- reactjs - onImageLoad 回调反应 js
- javascript - 使用 JavaScript 将封装在星号 (*) 中的动态文本更改为网页上的链接
- javascript - 如何将 Firestore 集合存储到变量中,然后使用 Javascript 访问其中的文档?
- java - 带控制移位输入的移位字符串,逻辑相同但结果不同
- xamarin.android - 如何从数组中删除空格和一些符号
- jhipster - JHipster Gateway 作为应用平台?
- lean - 在精益中证明 p 或 q 当且仅当 q 或 p