、解析類繼承中父類與子類之間成員的訪問可見度: 外部可見度:指的是被子類繼承的父類成員在子類的外部訪問控制度,有protected、public、private。 內部可見度:指的是被子類繼承的父類成員在子類定義的方法中的內部訪問控制度,有可訪問(Y)、不可訪問(N)。 class A { private: void pvA(); protected: void ptA() public: void pbA(); .... } class B:public A { void func() { pvA(); //error ptA(); //ok pbA(); //ok } .... } void g( B &b) { b.pvA(); //error b.ptA(); //error b.pbA(); //ok } class B:protected A { void func() { pvA(); //error ptA(); //ok pbA(); //ok } .... } void g( B &b) { b.pvA(); //error b.ptA(); //error b.pbA(); //error } class B:private A { void func() { pvA(); //error ptA(); //ok pbA(); //ok } .... } void g( B &b) { b.pvA(); //error b.ptA(); //error b.pbA(); //error } 二、類的構造函數中調用虛方法會怎麼樣: 構造函數中調用了虛方法將導致運行時錯誤。原因是:當父類的構造函數被調用的時候,此時子類的構造函數還沒有被調用,但是由於父類的構造函數中調用了虛方法,根據虛方法的實現機制,父類調用的虛方法是定義在子類中的,也就是說在此期間調用的virtual函數下降到子類階層中,而子類的函數要使用子類的成員變量,而此時子類的成員變量還沒有被初始化,這就意味著調用了一個還沒有完成構造的類型對象的方法,於是就出現了調用錯誤。 順便提一下:當一個類型被構造的時候,其構造順序是:先執行成員變量的初始化表達式,然後執行父類的構造函數,最後調用類型自己的構造方法。 三、內存中分配引用類型的實質: 首先在堆棧上分配一個引用對象,在堆上分配一個對象實例,然後使得堆棧上的引用對象指向堆上的對象實例。 例如: class person { private: char *name; int age; public: person(char *s,int n):name(s),age(n){} .... } person a=new person("Tom",24); person b=a; //設計到深淺拷貝的問題