1. 父子间的冲突
(1)子类可以定义父类中的同名成员
(2)子类中的成员将隐藏父类中的同名成员(同名覆盖)
(3)父类中的同名成员依然存在于子类中
(4)通过作用域分辨符(::)访问父类中的同名成员
【编程实验】同名成员变量深度分析
#include <iostream> #include <string> 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 = 100; //子类中的mi c.Parent::mi = 1000; //父类中的mi,被隐藏,须加作用域分辨符访问 cout <<"&c.mi = " << &c.mi << endl; cout <<"c.mi = " << c.mi << endl; cout <<"&c.Parent::mi = " << &c.Parent::mi << endl; cout <<"c.Parent::mi = " << c.Parent::mi << endl; return 0; } /*输出结果: Parent(): &mi = 0x23fea8 Child() : &mi = 0x23feac &c.mi = 0x23feac c.mi = 100 &c.Parent::mi = 0x23fea8 c.Parent::mi = 1000 */
2. 再论重载
(1)重载函数的本质为多个不同的函数
(2)函数名和参数列表是唯一的标识
(3)函数重载必须发生在同一个作用域中
3. 父子间的函数重载
(1)子类中的函数将隐藏父类的同名函数
(2)子类无法重载父类中的成员函数
(3)使用作用域分辨符访问父类中的同名函数
(4)子类可以定义父类中完全相同的成员函数
【编程实验】父子间的函数重载
#include <iostream> #include <string> using namespace std; class Parent { public: int mi; void add(int v) { mi += v; } void add(int a, int b) //Parent中的两个add构成重载关系 { mi += (a + b); } }; /* 1、child中的3个add函数构成了重载关系 2、因child出现了以add命名的函数(只要有1个与父类同名的函数),所以父类的所有名为add的函数 在子类中都会被隐藏起来 */ 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 = 100; //子类中的mi c.Parent::mi = 1000; //父类中的mi,被隐藏,须加作用域分辨符访问 cout <<"c.mi = " << c.mi << endl; //100 cout <<"c.Parent::mi = " << c.Parent::mi << endl; //1000 c.add(1); //子类的add c.Parent::add(2, 3); //父类的add,在子类中被隐藏,须加作用域访问符 c.add(4, 5, 6); //子类的add cout << endl; cout <<"c.mi = " << c.mi << endl; //116 cout <<"c.Parent::mi = " << c.Parent::mi << endl; //1005 return 0; }
4. 小结
(1)子类可以定义父类中的同名成员
(2)子类中的成员将隐藏父类中的同名成员
(3)子类和父类中的函数不构成重载关系
(4)子类可以定义父类中完全相同的成员函数
(5)使用作用域分辨符访问父类中的同名成员
时间: 2024-11-03 21:07:19