2010-10-15 55 views
3

以下哪一項更好?未實現的基類函數應該是0嗎?

class Foo { 
virtual void unimplementedFunc() = 0; 
}; 

或者

 class Foo { 
     virtual void unimplementedFunc(); 
     }; 

//in cpp 
void Foo::unimplementedFunc() 
{ 
    //not implemented in base 
} 

感謝

回答

1
class Foo { 
virtual void unimplementedFunc() = 0; 
}; 

你有一個pure virtual functionFoo,所以富是一個抽象類。換句話說,你不能實例化Foo。大多數派生類需要提供虛函數的實現。

另一方面,第二個版本聲明瞭一個虛函數(不是純函數)並在類之外定義它。派生類可以通過覆蓋函數來實現所需的行爲。

注意:純虛函數可以選擇有一個正文。例如

class Foo { 
    virtual void unimplementedFunc() = 0; 
    }; 

void Foo::unimplementedFunc() {} //is valid 
1

有兩個除了它是未實現之間的差異。通過將其設置爲零,您已將第一個Foo類設爲abstract class。創建空函數的第二種方法並沒有這樣做。

+0

因此,如果它是零,繼承者被迫執行它? – jmasterx 2010-10-15 03:18:37

+0

@Milo:是的。 http://www.parashift.com/c++-faq-lite/abcs.html#faq-22.4 – jamesdlin 2010-10-15 03:20:08

3

這取決於您的要求。派生類需要實現該方法本身還是可選的?允許直接實例化基類是否有意義?

如果需要實現,則讓編譯器通過使其成爲純虛擬方法來強制實施。

1

在上面的代碼中,基類成爲抽象類時= 0(即)基本:: foo的()一個純虛函數(用 「= 0」 表示)。 *

一個類是抽象的,如果它包含至少一個純虛函數在 。

不可以創建抽象類的實例,也不能將抽象類用作函數參數或返回類型。 抽象類指針和引用總是合法的。 通常,抽象類的使用與上述示例中一樣,用作基礎,並允許通過實際引用派生類型實例的指針或引用進行操作。

創建一個空函數的第二種方法並沒有這樣做。

Ref:http://www.glenmccl.com/tip_033.htm

相關問題