重載關係 一組函數要重載,必須處在同一個作用域中 ,而且函數名字相同,參數列表不同 代碼1中的Base中的 show() 和show(int) 屬於重載 代碼2中的Base中的 show() 和Derive中的show()不屬於重載不在同一個作用域下麵 隱藏的關係(主要是指作用域隱藏) 在繼承結構當 ...
重載關係
一組函數要重載,必須處在同一個作用域中 ,而且函數名字相同,參數列表不同
代碼1中的Base中的 show() 和show(int) 屬於重載
代碼2中的Base中的 show() 和Derive中的show()不屬於重載不在同一個作用域下麵
隱藏的關係(主要是指作用域隱藏)
在繼承結構當中,派生類的同名成員,把基類的同名成員給隱藏掉了
例如代碼2中的 Derive中的show() 和Base()中的show() ,show(int) 是隱藏關係
代碼1
class Base
{
public:
Base(int data=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=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=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=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=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=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的記憶體塊 ,危險訪問