[轉載]關於C++的子類指針指向父類.

http://blog.sina.com.cn/s/blog_3ce156ce01000af4.html



1,直接用基類指針引用基類對象
2,直接用派生類指針引用派生類對象
3,用基類指針引用一個派生類對象,由於派生類對象也是基類的對象,所以這種引用是安全的,
但是隻能引用基類成員。若試圖通過基類指針引用那些只在派生類中才有的成員,編譯器會報告語法錯誤。(解決該問題的答案是虛函數和多態性)
4,用派生類指針引用基類的對象。這種引用方式會導致語法錯誤。派生類指針必須先強制轉換爲基類指針,這種方法是不安全的。 

而在侯捷的深入淺出MFC中第二章C++重要性質中:
1、如果你以一個"基類之指針"指向一個"派生類之對象",那麼經由該指針你只能調用該基類所定義的函數
2、如果你以一個“派生類之指針”指向一個“基類之對象”,你必須先做明顯的轉型操作(explicit cast),這種作法很危險。
3、如果基類和派生類都定義了“相同名稱之函數”,那麼通過對象指針調用成員函數時,到底調用了那個函數,必須視該指針的原始類型而定,而不是視指針實際所指的對象的類型而定,這與第1點其實意義相通。

#include <iostream>
#include <stdlib.h>

using namespace std;

class A
{
public:
  char str[20];
  void f(){cout<<"class A"<<endl;}
  void fff(){cout<<"class A's str "<<str<<endl;} 
  void add(){cout<<"class A address: "<<this<<endl;}
};

class B:public A
{
public:
  int i;
  char sb[20];
  B(){cout<<"class B constructor is run."<<endl;}
  ~B(){cout<<"class B destructor is run."<<endl;}
  void f(){cout<<"class B"<<endl;}
  void ff(){cout<<"class B "<<i<<str<<sb<<endl;}
  void add(){cout<<"class B address: "<<this<<endl;}
};

int main(int argc, char *argv[])
{
  //聲明父類對象
  A b;
  //聲明父類對象的指針,指向父類對象
  A *pa=&b;
  pa->add();
  //這個寫法正確,不過很危險,因爲pa到底是指向B還是A是不確定的.如果能明確的知道
  //pa是指向B類對象的,就如現在寫的這個,那麼沒問題,如果pa指向A類對象,就會存在
  //風險.改變指針的類型,並不會影響內存分配既不會調用構造函數

  B *pb=(B *)pa;
  //類型強制轉化後,指向的地址相同. 但會按轉化類型訪問數據成員.
  //成員函數屬於類而不屬於對象.各對象共用類的成員函數.強制轉換成 B 類型後,可
  //調用類的成員函數。編譯pb->add();後的代碼只是調用add函數的時候傳入了pb的對
  //象指針this
  pb->add();

  //由於pa指向的是父類對象的地址,這個指針被強制轉換爲派生類指針後,會出現內存越
  //界訪問的情況,是不安全的.
  pb->i=100;
  char dsd[100];
  strcpy(pb->sb, " class B's sb.");
  strcpy(pb->str, " class A's str.");

  //pb->f()調用的具體函數,視指針的原始類型而定,而不是視指針實際所指的對象的
  //類型而定.如果是虛函數,則視實際所指的對象的類型而定
  pb->f();
  pb->ff();
  pb->fff();

  system("PAUSE");
  return 0;
}


//總結就是(標題點亮重點:子類指針指向父類):  只建立了父類的對象A, A::this的對象地址都沒變,轉換前後雖然指向的對象都是pa(父類對象地址),調用的時候卻只根據子類指針實際類型去調用函數..編譯器建立類的時候就確定類的成員函數名字,如add_A_XXX  



指向基類的指針可以指向派生類,反之不行.  關鍵是這裏根本沒有創建派生類的對象.單純用派生類指針調用他的函數而已



3,用基類指針引用一個派生類對象,由於派生類對象也是基類的對象,所以這種引用是安全的,
但是隻能引用基類成員。若試圖通過基類指針引用那些只在派生類中才有的成員,編譯器會報告語法錯誤。(解決該問題的答案是虛函數和多態性)
1、如果你以一個"基類之指針"指向一個"派生類之對象",那麼經由該指針你只能調用該基類所定義的函數
3、如果基類和派生類都定義了“相同名稱之函數”,那麼通過對象指針調用成員函數時,到底調用了那個函數,必須視該指針的原始類型而定,而不是視指針實際所指的對象的類型而定,這與第1點其實意義相通。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章