1. 程式人生 > >006 子類父類賦值兼容規則

006 子類父類賦值兼容規則

指針 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 子類父類賦值兼容規則