006 子類父類賦值兼容規則
阿新 • • 發佈:2018-09-29
指針 meta namespace vat div cti using fun title
子類和父類的賦值兼容規則
1.同名隱藏(非常重要)
當子類的成員方法(show)和父類的成員方法(show)的名字相同的時候,父類的所有(show)方法,都不能用子類的對象來調用了,這種現象就是同名隱藏。
#include <iostream>
using namespace std;
class Base{
public:
Base():d(0){}
~Base(){}
void show(){
cout << "Base show" << endl;
}
void show(int i){
cout << "Base show(" << i << endl;
}
private:
int d;
};
class D : public Base{
public:
D():x(0){}
~D(){}
void show(){
cout << "D show" << endl;
}
private:
int x;
};
int main(){
D d;
d.show();
//編譯不過
//d.show(20);//因為子類也定義了show方法,所以父類的2個show方法,就都不可以用子類的對象來調用了
d.Base::show(20);
}
2.子類和父類的對象/指針/引用賦值
可以用子類的對象/地址/引用去賦值給父類,叫對象切片,或者叫向上賦值,但是反過來是不可以的。
賦值後,只能調用父類裏的成員方法,不能調用子類裏的成員方法。
#include <iostream>
using namespace std;
class Base{
public:
Base():d(0){}
~Base(){}
void show(){
cout << "Base show" << endl;
}
void show(int i){
cout << "Base show(" << i << endl;
}
private:
int d;
};
class D : public Base{
public:
D():x(0){}
~D(){}
void show(){
cout << "D show" << endl;
}
void list(){
cout << "D list" << endl;
}
private:
int x;
};
int main(){
D d;
Base b;
b = d;
b.show();
//編譯不過
//b.list();//不可以用父類的對象調用子類的方法
Base *pb;
pb = &d;
pb->show();//調用的是父類的show方法
//編譯不過
//pb->list();//不可以用父類的指針調用子類的方法
Base &ps = d;
ps.show();//調用的是父類的show方法
//編譯不過
//ps.list();//不可以用父類的引用調用子類的方法
}
3. 虛函數
當用子類的對象/指針/引用去賦值給父類時,如果子類和父類都有同名方法show,當調用show的時候,發現調用的是父類的show方法。如果想要達到調用子類的show方法的效果的話,必須用virtual關鍵字,修飾父類的show方法,而且父類必須是指針或者引用,不可以是對象。
#include <iostream>
using namespace std;
class Base{
public:
Base():d(0){}
~Base(){}
virtual void show(){//虛函數
cout << "Base show" << endl;
}
void show(int i){
cout << "Base show(" << i << endl;
}
private:
int d;
};
class D : public Base{
public:
D():x(0){}
~D(){}
void show(){
cout << "D show" << endl;
}
void list(){
cout << "D list" << endl;
}
private:
int x;
};
int main(){
D d;
Base b;
b = d;
b.show();//調用的是父類的show
Base *pb;
pb = &d;
pb->show();//調用的是子類的show
Base &ps = d;
ps.show();//調用的是子類的show
}
006 子類父類賦值兼容規則