2012-06-12 27 views
1

我對純虛函數有個疑問。我不清楚它是如何工作的以及何時需要使用純虛函數。這是我不明白的例子:純虛函數,它是如何工作的

file.h 

class A 
{ 
public : 
      A(); 
      ~A(); 

      virtual void func1(void) = 0; 
      virtual UINT32 func2(void) = 0; 
      UINT32 initialize(void) = 0; 
} 


file.cpp 

UINT32 A:initialize (void) 
{ 
      func1(); 
      func2(); 
      return (result); 
} 

誰能詳細解釋一下這個例子實際上做什麼,結果是什麼? 我真的很感謝你的幫助和知識。非常感謝你。

+0

這不會編譯。你確定你不是指''UINT32 result = func2();'而不是'func2();'在A:initialize函數的中間嗎? – Lalaland

+0

是的,我認爲這是一個錯誤。你是對的。謝謝.. :) –

+0

[純虛函數與實現]的可能重複(http://stackoverflow.com/questions/2089083/pure-virtual-function-with-implementation) –

回答

1

(注意,爲initialize()聲明不應該是虛擬的,和initialize()實施應返回func2()可能。由於這是一個例子, initialize()做什麼並不重要,但它應該正確編譯。)

虛擬函數的主要目的是爲了ieve多態性。

A定義了兩個純虛方法,initialize調用它們。這允許程序中的代碼初始化A類型的東西而不知道子類。可能有許多A的子類,並且在func1()func2()之內,每個子類可能會稍有不同。由於只知道A的代碼有時會通過A初始化不同類型的對象,因此可以將A稱爲多態類型。

class B : public A { 
    void func1() { std::cout << "B::func1" << std::endl; } 
    UINT32 func2() { return 1; } 
}; 

class C : public A { 
    void func1() { std::cout << "C::func1" << std::endl; } 
    UINT32 func2() { return 2; } 
}; 

void call_initialize (A *a) { 
    std::cout << a->initialize() << std::endl; 
} 

B b; 
C c; 
call_initialize(&b); 
call_initialize(&c); 

結果輸出:

B::func1 
1 
C::func1 
2 

這是多態行爲的示例,這是因爲輸出取決於如果A通過B或通過C子類是不同的。

+0

感謝您的解釋。你的例子真的很有幫助!! ..非常感謝.. :) –

+0

@SitiHaslinaMohdZulkafli:不客氣。 +1在你的問題上。 – jxh

0

功能func1 & func2未在A中實現(按照所示代碼)。
如果它們被實現,那麼它們被調用。如果有)的B的版本派生類A和如果派生類對象被創建多態,即

class B : public A 
{ 
..... 
}; 

A* obj = new B(); 

obj->initialize(); 

然後func1的()和FUNC2(被稱爲如果乙實現它們。

正如Ethan在評論中提到的,你沒有從func2()中得到結果。
所以,你需要或者寫

UINT32 result = func2(); 

return func2(); 
+0

owh ..你的意思是,有一個在這段代碼錯誤的權利?..我只是意識到..是的,也許它的錯字錯誤..我不太確定,但你的幫助真的很感激。謝謝.. :) –

+0

這裏不會調用'A :: func1'和'A :: func2',即使它們被實現,因爲它們是純虛擬的。只有覆蓋它們的派生類才能被實例化,而這些覆蓋將被調用。 –