2014-09-19 83 views
-2

因此,我的教授喜歡用我們應該弄清楚的論文中的代碼來測試我們。我不打算髮布代碼,因爲我沒有在尋找答案,這只是他用來混淆我們的一件事,當他初始化一個類的對象,然後初始化另一個類的指針指向上述目的。它讓我感到困惑,這是一個特殊的問題,我不知道如何去尋找它。例如:指向類E成員的D類指針

class A { 

// etc 
} 

... 


class D { 
void fy(etc, etc, etc) {} 
// etc 
} 


class E: public D { 
void fy(etc, etc, etc) {} 
// etc 
} 

main() { 
E e 
D *d = &e 
d->fy(15,25) 
//everything else 

確實「d-> fy()」做了D或E的fy()函數嗎?如果D'fy()函數是虛擬的,那麼它會做E嗎?

當指針從一個類指向另一個類的對象時,指針會做什麼?我知道這個問題以前可能已經得到了答案,但我無法在任何地方找到它,所以我甚至會感激只是被引導到答案。非常感謝你。

+0

查看Liskov替換原理,'E'是'D',所以你可以使用'E *'並將它存儲在'D *'中。 – 2014-09-19 23:14:08

回答

0

該行class E: public D表示任何ED。因此,E的任何地址都可以存儲到指向D的指針中。

0

答案在於類聲明:

class E : public D 

E是d的一個子類,這意味着類型E的任何對象也是類型D.的一個目的其結果是,類型的實例E可以分配給類型D的指針。但是,在訪問該指針時,只能訪問D類的成員,而不是E類,因爲指針類型仍然是D.爲了訪問特定於E類,您需要投射對象類型。

+0

爲了響應您的編輯,請查看http://stackoverflow.com/questions/11067975/visual-c-overriding-non-virtual-methods – rdowell 2014-09-19 23:12:18