2013-08-24 51 views
1

虛函數最近,我才知道,在C++中的純虛函數可以有一個身體。C++純用身體

我知道虛函數體存在,因爲我想從派生類打電話給她,但我能做到這一點?

class Base{ 
    int x; 
    public: 
    virtual void print()=0; 
}; 

void Base::print(){ 
    cout << x; 
} 

class Derived : public Base{ 
     int y; 
    public: 
     void print(){ 
      Base::print(); 
      cout << y; 
     } 
}; 

而結果將是:x的值,然後y的值?

我真的意味着函數庫:: print()函數就會知道,從功能得到派生類x的值????

+0

@kol:你的編譯器 – rems4e

+0

@kol:是的,他們可以有這甚至可以被調用的主體。:)「」有效C++」邁爾斯提到了一個純VIRTUA一個原因l函數有一個主體:實現這個純虛函數的派生類可以在他們的代碼中調用這個實現。如果兩個不同派生類的部分代碼是相似的,那麼即使該函數應該是純虛擬的,它在層次結構中向上移動也是有意義的。「 – lpapp

+0

執行* what * exact的結果還有'Base :: print ()''不會從'Derived'中的函數中獲取任何值,因爲Derived沒有函數返回任何值 - 您可能需要重新編寫該部分的代碼。 – millimoose

回答

2

抽象函數當然可以有一個實現,在抽象析構函數的情況下,甚至需要該函數仍然實現(使析構函數virtual並不意味着畢竟只有派生的析構函數被調用)。 ...並且抽象函數的實現仍然是訪問其類的成員的普通函數。

xBase在你的例子成員。令人驚訝的約Base::print()有機會獲得的Base私有成員?

3

對於下面的代碼,輸出將爲「12」,所以是的,帶有主體的純虛函數將被調用,然後是派生的打印。所以,是的,結果將會是:x的值,然後是y的值,就像你猜測的一樣。這是有效的C++,是的,它會知道如何在該上下文中獲得'x'。

有效的C++「Scott Meyers提到了一個純虛函數擁有一個主體的原因:實現這個純虛函數的派生類可以在他們的代碼中調用這個實現,如果兩個不同派生類的部分代碼是那麼類似的是有意義的它在層次結構上移,即使函數應該是純虛

#include <iostream> 

using namespace std; 

class Base{ 
    int x; 
    public: 
    Base(): x(1) {} 
    virtual void print()=0; 
}; 

void Base::print(){ 
    cout << x; 
} 

class Derived : public Base{ 
     int y; 
    public: 
     Derived(): Base(), y(2) {} 
     void print(){ 
      Base::print(); 
      cout << y; 
     } 
}; 

int main() 
{ 
    Derived d; 
    d.print(); 
    return 0; 
} 

輸出:12

+0

@ user2713409:這是否回答你的問題? – lpapp