【发布时间】:2018-06-24 20:54:29
【问题描述】:
我有以下代码。此代码的目的是
#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),但显然我的代码是错误的。
我怀疑我没有正确初始化父结构,但除了我不知道我做错了什么之外。
【问题讨论】:
-
B中名为m1的成员隐藏了A中的所有同名成员。要公开它们,请在B正文的任何位置添加此行:using A::m1;,其他成员也是如此。 -
using A::m1是否有一个“catch all”语句,所以我会公开每个非显式覆盖的函数? -
@zython:你自动拥有它。如果派生类没有覆盖
m1,则不会隐藏基类重载。只有您在派生类中定义的名称(无论是否为虚拟)才会隐藏基类成员。 -
所以没有机制(例如使用类)来达到我想要的效果?
-
为什么要将
b->m1(1)解析为B::m2(int a)? (注意m1与m2;这是一个错字还是你真的期待这样的结果?)
标签: c++ inheritance virtual