多載關系
一組函式要多載,必須處在同一個作用域中 ,而且函式名字相同,引數串列不同
代碼1中的Base中的 show() 和show(int) 屬于多載
代碼2中的Base中的 show() 和Derive中的show()不屬于多載不在同一個作用域下面
隱藏的關系(主要是指作用域隱藏)
在繼承結構當中,派生類的同名成員,把基類的同名成員給隱藏掉了
例如代碼2中的 Derive中的show() 和Base()中的show() ,show(int) 是隱藏關系
代碼1
class Base
{
public:
Base(int data=https://www.cnblogs.com/erichome/archive/2022/11/27/10):ma(data){
cout<<"Base"<<endl;
}
void show(){cout<<"Base Show()"<<endl;}
void show(int){cout<<"Base Show(int)"<<endl;}
~Base(){cout<<"~Base()"<<endl;}
protected:
int ma;
};
class Derive : public Base
{
public:
Derive(int data=https://www.cnblogs.com/erichome/archive/2022/11/27/20):Base(data),mb(data){
cout<<"Derive"<<endl;
}
~Derive(){cout<<"~Derive()"<<endl;}
private:
int mb;
};
int main(){
Derive d(20);
d.show(); //正常呼叫基類show()
d.show(100); //正常呼叫基類show(int)
return 0;
}
代碼2
class Base
{
public:
Base(int data=https://www.cnblogs.com/erichome/archive/2022/11/27/10):ma(data){
cout<<"Base"<<endl;
}
void show(){cout<<"Base Show()"<<endl;}
void show(int){cout<<"Base Show(int)"<<endl;}
~Base(){cout<<"~Base()"<<endl;}
protected:
int ma;
};
class Derive : public Base
{
public:
Derive(int data=https://www.cnblogs.com/erichome/archive/2022/11/27/20):Base(data),mb(data){
cout<<"Derive"<<endl;
}
void show(){cout<<"Derive Show()"<<endl;}
~Derive(){cout<<"~Derive()"<<endl;}
private:
int mb;
};
int main(){
Derive d(20);
d.show(); //呼叫子類show()
d.show(100);//呼叫報錯 報錯資訊 "Derive::show()函式不接受1個引數"
// 即 Derive中的show()方法把Base中的show()和show(int)都給隱藏掉了
// 所以d.show()沒問題,呼叫的是派生類的show(),但是d.show(100)報錯了,因為
// 父類的show()和show(int)都被隱藏了,而派生類Derive中沒有 show(int)方法所以報錯了
// 如果想呼叫父類的show(int) 要這樣寫 d.Base.show(100);
return 0;
}
基類物件 -> 派生類物件 型別由上向下轉 NOT OK
Base b(10);
Derive d(20);
d=b;// NOT OK
派生類物件 ->基類物件 型別由下向上轉 OK
Base b(10);
Derive d(20);
b=d;//OK

派生類指標(參考) ->基類指標 型別由下向上轉 OK
Base b(10);
Derive d(20);
Base *pb =&d;// OK 如下圖, 基類指標只能訪問到基類那一部分的成員,所以是安全的

代碼3
class Base
{
public:
Base(int data=https://www.cnblogs.com/erichome/archive/2022/11/27/10):ma(data){
cout<<"Base"<<endl;
}
void show(){cout<<"Base Show()"<<endl;}
void show(int){cout<<"Base Show(int)"<<endl;}
~Base(){cout<<"~Base()"<<endl;}
protected:
int ma;
};
class Derive : public Base
{
public:
Derive(int data=https://www.cnblogs.com/erichome/archive/2022/11/27/20):Base(data),mb(data){
cout<<"Derive"<<endl;
}
void show(){cout<<"Derive Show()"<<endl;}
~Derive(){cout<<"~Derive()"<<endl;}
private:
int mb;
};
int main(){
Base b(10);
Derive d(20);
Base *pb =&d;
pb->show(); //呼叫的是基類的 show
pb->show(100);//呼叫的是基類的 show(int)
((Derive *)pb)->show(); //強轉后 呼叫的是派生類的 show
}
基類指標(參考) -> 派生類物件 型別由上向下轉 NOT OK
Base b(10);
Derive d(20);
Derive *pb =&b;// NOT OK pb指標能夠訪問的區域超過了實際物件b的記憶體塊 ,危險訪問
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/538517.html
標籤:其他
