一、父子间的冲突
1、子类可以定义父类中的同名成员变量
2、子类中的成员将隐藏父类中的同名成员
3、父类中的同名成员依然存在于子类中
4、通过作用域分辨符(::)访问父类中的同名成员
#include<iostream> using namespace std; class Parent { public: int mi; Parent() { cout << "&Parent.mi=" << &mi << endl; } }; class Child : public Parent { public: int mi; Child() { cout << "&Child.mi=" << &mi << endl; } }; int main() { Child c; c.mi = 1000;//访问子类的 c.Parent::mi = 100;//通过作用域分辨符来访问父类中的同名成员变量 cout << endl; cout <<"&c.mi=" << &c.mi << endl; cout << "c.mi=" << c.mi << endl; cout << endl; cout << "&c.Parent::mi=" << &c.Parent::mi << endl; cout << "c.Parent::mi=" << c.Parent::mi << endl; return 0; } //输出结果 /* &Parent.mi=0xbff768d8 //注意是先调用的是父类的构造函数 &Child.mi=0xbff768dc &c.mi=0xbff768dc c.mi=1000 &c.Parent::mi=0xbff768d8 c.Parent::mi=100 */
二、再论重载
1、类中的成员函数可以重载
(1)、重载函数的本质为多个不同的函数
(2)、函数名和参数列表是唯一的标识
(3)、函数重载必须发生在同一作用域中
2、父子间的同名函数
(1)、子类中的函数将隐藏父类中的函数
(2)、子类无法重载父类中的成员函数
(3)、使用作用域分辨符访问父类中的同名函数
(4)、子类可以定义父类中完全相同的函数
#include<iostream> using namespace std; class Parent { public: int mi; void add(int v) { mi += v; } void add(int x, int y) { mi += (x + y); } }; class Child : public Parent { public: int mi; void add(int v) { mi += v; } void add(int x, int y, int z) { mi += (x + y + z); } }; int main() { Child c; c.mi = 1000; c.Parent::mi = 100; cout << "c.mi = " << c.mi << endl; cout << "c.Parent::mi = " << c.Parent::mi << endl; c.add(1); c.Parent::add(1); cout << "c.mi = " << c.mi << endl; cout << "c.Parent::mi = " << c.Parent::mi << endl; // c.add(1, 2);//子类没有这个函数,会编译出错, 子类中只要有一个函数与父类中的函数同名(同名即可),父类中所有同名的函数都会被隐藏起来 c.Parent::add(1, 2); cout << "c.Parent::mi = " << c.Parent::mi << endl; return 0; } //输出结果 /* c.mi = 1000 c.Parent::mi = 100 c.mi = 1001 c.Parent::mi = 101 c.Parent::mi = 104 */
三、小结
1、子类可以定义父类中的同名成员
2、子类中的成员将隐藏父类中的同名成员
3、子类和父类中的函数不能构成重载关系
4、子类可以定义父类中完全相同的成员函数
5、使用作用域分辨符访问父类中的同名成员