c++规则:
(1)如果派生类的函数与基类的函数同名,但是参数不同。此时,不论有无virtual关键字,基类的函数将被隐藏。
(2)如果派生类的函数与基类的函数同名,并且参数也相同,但是基类函数没有virtual关键字。此时,基类的函数被隐藏。
这种隐藏规则,不仅仅是表现在对成员函数上,对同名的data member也是如此。
虽然B中的g函数与A中的g函数参数个数不同,但是仍然将A类中的g函数隐藏了。导致编译的时候报错,不存在g(float,float)函数
#include "iostream"
using namespace std;
class A{
public:
void f1(){
std::cout << "A::f1" << std::endl;
}
virtual void g(float v,float c){
std::cout <<"A::g" << std::endl;
}
};
class B : public A{
public:
void f1(){
std::cout << "B::f1" << std::endl;
}
virtual void g(float v){
std::cout <<"B::g" << std::endl;
}
};
int main(){
B *p = new B();
p->g(92.0f,7.0f);
p->f1();
return 0;
}
编译报错:
$ g++ over.cpp -std=c++11
over.cpp: In function ‘int main()’:
over.cpp:32:20: error: no matching function for call to ‘B::g(float, float)’
p->g(92.0f,7.0f);
^
over.cpp:23:18: note: candidate: virtual void B::g(float)
virtual void g(float v){
^
over.cpp:23:18: note: candidate expects 1 argument, 2 provided