令人迷惑的隐藏规则
本来仅仅区别重载与覆盖并不算困难,但是 C++的隐藏规则使问题复杂性陡然增加。 这里“隐藏”是指派生类的函数屏蔽了与其同名的基类函数,规则如下:
(1)如果派生类的函数与基类的函数同名,但是参数不同。此时,不论有无 virtual 关键字,基类的函数将被隐藏(注意别与重载混淆)。
(2)如果派生类的函数与基类的函数同名,并且参数也相同,但是基类函数没有 virtual 关键字。此时,基类的函数被隐藏(注意别与覆盖混淆)。
1 #include <iostream> 2 3 /* run this program using the console pauser or add your own getch, system("pause") or input loop */ 4 using namespace std; 5 int main(int argc, char** argv) { 6 //定义结构类型 7 struct human { 8 char name[10]; 9 int sex; 10 int age; 11 }; 12 13 //声明结构变量和结构指针变量,并初始化 14 struct human x={"WangPing",1,30},*p=NULL; 15 16 //结构指针变量指向对象 17 p=&x; 18 19 //显示结构变量的值 20 cout<<"x.name="<<x.name<<endl; 21 cout<<"x.sex="<<x.sex<<endl; 22 cout<<"x.age="<<x.age<<endl; 23 24 //利用结构指针显示结构对象中的数据 25 cout<<"(*p).name="<<(*p).name<<endl; 26 cout<<"(*p).sex="<<(*p).sex<<endl; 27 cout<<"(*p).age="<<(*p).age<<endl; 28 cout<<"p->name="<<p->name<<endl; 29 cout<<"p->sex="<<p->sex<<endl; 30 cout<<"p->age="<<p->age<<endl; 31 32 //通过结构指针为结构对象输入数据 33 cout<<"name:"; 34 cin>>(*p).name; 35 cout<<"sex:"; 36 cin>>(*p).sex; 37 cout<<"age:"; 38 cin>>(*p).age; 39 40 //显示结构变量的值 41 cout<<"x.name="<<x.name<<endl; 42 cout<<"x.sex="<<x.sex<<endl; 43 cout<<"x.age="<<x.age<<endl; 44 return 0; 45 }