1.当子类成员和父类成员同名时,子类依然从父类继承同名成员
2.如果子类有成员和父类同名,子类访问其成员默认访问子类的成员(本作用域,就近原则)
3.在子类通过作用域::进行同名成员区分(在派生类中使用基类的同名成员,显示使用类名限定符)
class Base{ public: Base():mParam(0){} void Print(){ cout << mParam << endl; } public: int mParam; }; class Derived : public Base{ public: Derived():mParam(10){} void Print(){ //在派生类中使用和基类的同名成员,显示使用类名限定符 cout << Base::mParam << endl; cout << mParam << endl; } //返回基类重名成员 int& getBaseParam(){ return Base::mParam; } public: int mParam; }; int main(){ Derived derived; //派生类和基类成员属性重名,子类访问成员默认是子类成员 cout << derived.mParam << endl; //10 derived.Print(); //类外如何获得基类重名成员属性 derived.getBaseParam() = 100; cout << "Base:mParam:" << derived.getBaseParam() << endl; return EXIT_SUCCESS; }
注意: 如果重新定义了基类中的重载函数,将会发生什么?
class Base{ public: void func1(){ cout << "Base::void func1()" << endl; }; void func1(int param){ cout << "Base::void func1(int param)" << endl; } void myfunc(){ cout << "Base::void myfunc()" << endl; } }; class Derived1 : public Base{ public: void myfunc(){ cout << "Derived1::void myfunc()" << endl; } }; class Derived2 : public Base{ public: //改变成员函数的参数列表 void func1(int param1, int param2){ cout << "Derived2::void func1(int param1,int param2)" << endl; }; }; class Derived3 : public Base{ public: //改变成员函数的返回值 int func1(int param){ cout << "Derived3::int func1(int param)" << endl; return 0; } }; int main(){ Derived1 derived1; derived1.func1(); derived1.func1(20); derived1.myfunc(); cout << "-------------" << endl; Derived2 derived2; //derived2.func1(); //func1被隐藏 //derived2.func1(20); //func2被隐藏 derived2.func1(10,20); //重载func1之后,基类的函数被隐藏 derived2.myfunc(); cout << "-------------" << endl; Derived3 derived3; //derived3.func1(); 没有重新定义的重载版本被隐藏 derived3.func1(20); derived3.myfunc(); return EXIT_SUCCESS; }
Derive1 重定义了Base类的myfunc函数,derive1可访问func1及其重载版本的函数。
Derive2通过改变函数参数列表的方式重新定义了基类的func1函数,则从基类中继承来的其他重载版本被隐藏,不可访问
Derive3通过改变函数返回类型的方式重新定义了基类的func1函数,则从基类继承来的没有重新定义的重载版本的函数将被隐藏。
任何时候重新定义基类中的一个重载函数,在新类中所有的其他版本将被自动隐藏。