以下哪一項更好?未實現的基類函數應該是0嗎?
class Foo {
virtual void unimplementedFunc() = 0;
};
或者
class Foo {
virtual void unimplementedFunc();
};
//in cpp
void Foo::unimplementedFunc()
{
//not implemented in base
}
感謝
以下哪一項更好?未實現的基類函數應該是0嗎?
class Foo {
virtual void unimplementedFunc() = 0;
};
或者
class Foo {
virtual void unimplementedFunc();
};
//in cpp
void Foo::unimplementedFunc()
{
//not implemented in base
}
感謝
class Foo {
virtual void unimplementedFunc() = 0;
};
你有一個pure virtual function內Foo
,所以富是一個抽象類。換句話說,你不能實例化Foo
。大多數派生類需要提供虛函數的實現。
另一方面,第二個版本聲明瞭一個虛函數(不是純函數)並在類之外定義它。派生類可以通過覆蓋函數來實現所需的行爲。
注意:純虛函數可以選擇有一個正文。例如
class Foo {
virtual void unimplementedFunc() = 0;
};
void Foo::unimplementedFunc() {} //is valid
有兩個除了它是未實現之間的差異。通過將其設置爲零,您已將第一個Foo
類設爲abstract class。創建空函數的第二種方法並沒有這樣做。
這取決於您的要求。派生類需要實現該方法本身還是可選的?允許直接實例化基類是否有意義?
如果需要實現,則讓編譯器通過使其成爲純虛擬方法來強制實施。
在上面的代碼中,基類成爲抽象類時= 0(即)基本:: foo的()一個純虛函數(用 「= 0」 表示)。 *
一個類是抽象的,如果它包含至少一個純虛函數在 。
不可以創建抽象類的實例,也不能將抽象類用作函數參數或返回類型。 抽象類指針和引用總是合法的。 通常,抽象類的使用與上述示例中一樣,用作基礎,並允許通過實際引用派生類型實例的指針或引用進行操作。
創建一個空函數的第二種方法並沒有這樣做。
因此,如果它是零,繼承者被迫執行它? – jmasterx 2010-10-15 03:18:37
@Milo:是的。 http://www.parashift.com/c++-faq-lite/abcs.html#faq-22.4 – jamesdlin 2010-10-15 03:20:08