C++继承时名字的遮蔽
如果派生類中的成員(包括成員變量和成員函數(shù))和基類中的成員重名,那么就會(huì)遮蔽從基類繼承過(guò)來(lái)的成員。所謂遮蔽,就是在派生類中使用該成員(包括在定義派生類時(shí)使用,也包括通過(guò)派生類對(duì)象訪問(wèn)該成員)時(shí),實(shí)際上使用的是派生類新增的成員,而不是從基類繼承來(lái)的。
成員函數(shù)的名字遮蔽:
#include<iostream> using namespace std;//基類People class People{ public:void show(); protected:char *m_name;int m_age; }; void People::show(){cout<<"嗨,大家好,我叫"<<m_name<<",今年"<<m_age<<"歲"<<endl; }//派生類Student class Student: public People{ public:Student(char *name, int age, float score); public:void show(); //遮蔽基類的show() private:float m_score; }; Student::Student(char *name, int age, float score){m_name = name;m_age = age;m_score = score; } void Student::show(){cout<<m_name<<"的年齡是"<<m_age<<",成績(jī)是"<<m_score<<endl; }int main(){Student stu("小明", 16, 90.5);//使用的是派生類新增的成員函數(shù),而不是從基類繼承的stu.show();//使用的是從基類繼承來(lái)的成員函數(shù)stu.People::show();return 0; }運(yùn)行結(jié)果:
小明的年齡是16,成績(jī)是90.5 嗨,大家好,我叫小明,今年16歲本例中,基類 People 和派生類 Student 都定義了成員函數(shù) show(),它們的名字一樣,會(huì)造成遮蔽。第 37 行代碼中,stu 是 Student 類的對(duì)象,默認(rèn)使用 Student 類的 show() 函數(shù)。
但是,基類 People 中的 show() 函數(shù)仍然可以訪問(wèn),不過(guò)要加上類名和域解析符,如第 39 行代碼所示。
基類成員函數(shù)和派生類成員函數(shù)不構(gòu)成重載
基類成員和派生類成員的名字一樣時(shí)會(huì)造成遮蔽,這句話對(duì)于成員變量很好理解,對(duì)于成員函數(shù)要引起注意,不管函數(shù)的參數(shù)如何,只要名字一樣就會(huì)造成遮蔽。換句話說(shuō),基類成員函數(shù)和派生類成員函數(shù)不會(huì)構(gòu)成重載,如果派生類有同名函數(shù),那么就會(huì)遮蔽基類中的所有同名函數(shù),不管它們的參數(shù)是否一樣。
下面的例子很好的說(shuō)明了這一點(diǎn):
#include<iostream> using namespace std;//基類Base class Base{ public:void func();void func(int); }; void Base::func(){ cout<<"Base::func()"<<endl; } void Base::func(int a){ cout<<"Base::func(int)"<<endl; }//派生類Derived class Derived: public Base{ public:void func(char *);void func(bool); }; void Derived::func(char *str){ cout<<"Derived::func(char *)"<<endl; } void Derived::func(bool is){ cout<<"Derived::func(bool)"<<endl; }int main(){Derived d;d.func("c.biancheng.net");d.func(true);d.func(); //compile errord.func(10); //compile errord.Base::func();d.Base::func(100);return 0; }本例中,Base 類的func()、func(int)和 Derived 類的func(char *)、func(bool)四個(gè)成員函數(shù)的名字相同,參數(shù)列表不同,它們看似構(gòu)成了重載,能夠通過(guò)對(duì)象 d 訪問(wèn)所有的函數(shù),實(shí)則不然,Derive 類的 func 遮蔽了 Base 類的 func,導(dǎo)致第 26、27 行代碼沒(méi)有匹配的函數(shù),所以調(diào)用失敗。
如果說(shuō)有重載關(guān)系,那么也是 Base 類的兩個(gè) func 構(gòu)成重載,而 Derive 類的兩個(gè) func 構(gòu)成另外的重載。
總結(jié)
以上是生活随笔為你收集整理的C++继承时名字的遮蔽的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Java @SuppressWarni
- 下一篇: Java 集合中存在多种数据类型