2013-10-02 211 views
3

我有3類C++ - 從抽象類繼承的抽象繼承的抽象方法是否有任何性能問題?

class GrandParent 
{ 
    virtual int GrandParentMethod() = 0; 
}; 

class Parent : public GrandParent 
{ 
    virtual int ParentMethod() = 0; 
    virtual int GrandParentMethod() = 0; 
}; 

class Child : public Parent 
{ 
    int ParentMethod() { return 1; } 
    int GrandParentMethod() { return 0; } 
}; 

我的問題是:在Parent類Declering GrandParentMethod使得它更容易一些時間(只需要檢查的抽象方法之一頭)後實施Child類,但它有任何性能(內存?CPU?)問題?

+0

它只對編譯過程有影響,在運行時沒有影響。如果您正確記錄這些類,那麼您不需要'Parent'類中的'GrandParentMethod'聲明。 –

回答

5

由於該方法是抽象的,因此應用程序不應該對應用程序有任何性能或CPU影響,儘管隨着需要讀取更多代碼,編譯可能會花費更長的時間。

但不要認爲這是不常見的成語C++的做法最終可能混淆一些代碼的讀者/維護者。此外,如果例如Grandparent方法的簽名發生變化,則通過在Parent級別重新聲明它,您還有一處可以更改(或者意外隱藏某個方法的風險)。

+2

* ...如果祖父母方法的簽名發生了變化* - 應考慮使用'覆蓋' – justin

+0

@justin許多商店僅部分使用C++ 11甚至根本不使用。 –

+0

我在'部分'陣營。當支持存在時(對於大多數目標),我啓用此功能。要清楚,這並不是說你的答案有任何問題(我加1)。它只是補充信息 - 「應該**使用'override'來考慮**」 – justin

0

您可能會遇到設計問題(例如:您不會有另一個枚舉 反映基類的枚舉)。另一個問題是,一個抽象函數可以有一個實現。

struct A { 
    virtual void f() = 0; 
}; 
void A::f() {} 

struct B : A { 
    virtual void f() override = 0; 
}; 

struct X : A { 
    // Delegates to A::f, which is well defined 
    virtual void f() override { return A::f(); } 
}; 

struct Y : B { 
    // Delegates to B::f, which is a 'undefined reference'. 
    virtual void f() override { return B::f(); } 
}; 

雖然沒有性能問題。