父子的冲突
-
思考问题:子类是否可以定义父类中的同名成员?如果可以,如何区分?如果不可以,为什么?
-
实验
-
新的知识点:
-
子类可以定义父类中的同名成员
-
子类中的成员将隐藏父类中的同名成员
-
父类中的同名成员依然存在于子类中
-
通过作用域分辨符(::)访问父类中的同名成员
-
访问父类中的同名成员
Child c; c.mi = 100; //子类中的mi c.Parent::mi = 1000;//父类中的mi
-
实验
// 父子间的冲突.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。 // #include <iostream> #include <string> using namespace std; class Parent { public: int mvalue; Parent() { mvalue = 0; } ~Parent() { } }; class Child :public Parent { public: int mvalue; Child() { mvalue = 0; } ~Child() { } }; int main() { Child c; c.mvalue = 5; c.Parent::mvalue = 10; cout << "c.mvalue=" << c.mvalue << endl; cout << "c.Parent::mvalue=" << c.Parent::mvalue << endl; }
-
运行结果
c.mvalue=5 c.Parent::mvalue=10
-
再论重载
-
类中的成员函数可以进行重载
-
重载函数本质为多个不同的函数
-
函数名和参数列表是唯一的标识
-
函数重载必须发生在同一个作用域中
-
思考:子类中定义的函数是否能重载父类中的同名函数
-
知识点
-
子类中的函数将隐藏父类的同名函数
-
子类无法重载父类中的成员函数(因为它们不属于同一个作用域)
-
使用作用域分辨符访问父类中的同名函数
-
子类可以定义父类中完全相同的成员函数
-
实验
// 父子间的冲突.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。 // #include <iostream> #include <string> using namespace std; class Parent { public: int mvalue; Parent() { mvalue = 0; } ~Parent() { } void set(int a) { mvalue = a; } }; class Child :public Parent { public: int mvalue; Child() { mvalue = 0; } ~Child() { } void set(int b,int c ) { mvalue = mvalue + b + c; } void set(int d,int e,int f) { mvalue = mvalue + d + e + f; } }; int main() { Child c; c.set(1,2); c.set(3, 4, 5); cout << "c.mvalue = " << c.mvalue << endl; cout << "c.Parent::mvalue = " << c.Parent::mvalue << endl; c.Parent::mvalue = 6; c.Parent::set(1); c.set(1, 2); c.set(3, 4, 5); cout << "c.mvalue = " << c.mvalue << endl; cout << "c.Parent::mvalue = " << c.Parent::mvalue << endl; }
-
运行结果
c.mvalue = 15 c.Parent::mvalue = 0 c.mvalue = 30 c.Parent::mvalue = 1
-
小结
-
子类可以定义父类中的同名成员
-
子类中的成员将隐藏父类中的同名成员
-
子类和父类中的函数不能构成重载关系
-
子类可以定义和父类中完全相同的成员函数
-
使用作用域分辨符访问父类中的同名函数
主要记录的是学习听课的笔记