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點其實意義相通。