我已經學到的繼承是這麼回事:
派生類擁有父類的所有變數和方法因為還沒有看c++深入理解物件模型或者之類的這種書,我也不想直接查資料,因此準備自己寫幾行**進行實驗
現在我有這幾個疑問
當父類與子類變數同名的時候,怎麼進行區分
當父類與子類函式同名的時候,怎麼進行處理
當父類與子類函式和變數同名的時候,怎麼進行處理
父類與子類變數同名也分成這幾種情況,我將一一進行**
父類public變數與子類public變數同名
父類private變數與子類private變數同名
父類public變數與子類private變數同名
父類private變數與子類public變數同名
使用以下**進行**
#include
using
namespace std;
class
parent
;public
:int pub;
private
:int pri;};
class
child
: parent
;public
:void
printself()
public
:int pub;
private
:int pri;};
intmain()
列印結果如下:
1 1
即:若子類變數與父類變數在public區域同名,則子類內會優先使用自己的變數
我老實思考了一下,大概應該是這麼回事:
當類使用乙個元素的時候,首先它會在自己的定義裡面找名字,找到名字以後再比較型別,若名字和型別都符合就算找到了,如果沒有找到再到它的祖先那裡去找
這樣子我又有乙個問題了:
如果有兩個基類,基類有一樣的public變數,那麼,又將怎麼樣呢
改寫**如下:
class
parent1
;public
:int pub;
private
:int pri;};
class
parent2
;public
:int pub;
private
:int pri;};
class
child
: parent1, parent2};
intmain()
這麼寫就報錯了,編譯器說pub和pri的**是ambiguous的
雖然已經猜到了問題3和問題4的結果,但是我還是打算試一試
class
parent1
;public
:int pub;
private
:int pri;};
class
child
: parent1
public
:int pri;
private
:int pub;};
intmain()
輸出結果果然是2 2
但是,在進行child進行構造的時候,我發現了乙個有趣的現象:
先構造child的pub即它的pricate變數、後構造它的pri即public變數,編譯時會產生警告:
main.cpp: in constructor 『child::child()』:
main.cpp:32:6: warning: 『child::pub』 will be initialized after [-wreorder]
32 | int pub;
| ^~~
main.cpp:30:6: warning: 『int child::pri』 [-wreorder]
30 | int pri;
| ^~~
main.cpp:25:2: warning: when initialized here [-wreorder]
25 | child(): pub(2), pri(2)
| ^~~~~
為了再研究變數的初始化順序,我寫下了如下**:
int times =0;
class
child
public
:int v1 = times ++
;private
:int v2 = times ++;}
;int
main()
多次實驗,最後的輸出結果均為:
0 1
是否一定就是public先初始化然後再初始化private呢?
如果是多個變數呢?初始化順序是否與**行的前後順序有關?
為了減少自己的疑慮,我改寫了自己的**
int times =0;
class
child
private
:int v1 = times ++
;int v3 =times ++
;public
:int v2 = times ++
;int v4 = times ++;}
;int
main()
多次實驗的結果均為
0 2 1 3
即說明:
初始化變數的順序與變數在private裡還是在public裡無關
初始化變數的順序只與**順序有關
因為時間的關係,我並沒有太多功夫把函式也做了,但是通過對變數的**,我大概能猜到其規律,留給下一次來做實驗
今天學到的東西有:
c++類的變數初始化順序與其型別無關,只與**順序有關
c++在乙個類裡面找乙個變數,首先會在這個類的定義裡面找同名的變數,找到以後比較型別,如果沒有找到,就會去父類找。這個規則是遞迴的
如果兩個父類都有同乙個變數名,則,若在子類中要使用父類的變數,必須宣告namespace,否則,編譯都過不去
雜談 對C 物件的研究
先看這麼一段 include using namespace std static int times 0 class test test private int id int main 這段 的執行結果是 create 0 create 1 finish destroy 0 destroy 0這狠...
繼承的進一步研究
本章目標 掌握子類物件的例項化過程 掌握方法覆寫的概念及實現 掌握super關鍵字的作用 子類物件例項化過程 在繼承的操作中,對於子類物件的例項化也是有要求的 子類物件在例項化之前必須首先呼叫父類中的構造方法之後再呼叫子類自己的構造方法 觀察子類物件的例項化過程 class person publi...
C 虛函式表研究 (一) 單繼承
c 虛函式表研究 一 單繼承 本文研究單繼承情況下,c 物件的虛函式表的具體情況。所用的編譯器為vc6.0。假設有兩個類a,b,其中b由a派生出來,a含有虛函式fun1,b含有虛函式fun2 a 的定義如下 b的定義如下 測試的 如下 測試 說明 虛函式表指標 int b 虛函式表位址 int b ...