2016-12-14 90 views
0

我是新的C++,我試圖實現以下的設計。通父類的引用在C參數在派生類++

class A { do(); doMore(); } // abstract 
class B { do(); doMore(); } // abstract 

class X : public A, public B // Also abstract 
{   
    foo() { 
     // common code 
     A::do(); 
     A::doMore(); 
    } 
    bar() { 
     // common code 
     B::do(); 
     B::doMore(); 
    } 
} 

A和B提供的do()doMore()實現。 我如何可以提取公共代碼,新的函數將調用在正確的父類方法的ARG?

喜歡的東西

X::newMethod(arg_that_indicates_parent_class) { 
    // common code 
    arg_that_indicates_parent_class::do(); 
    arg_that_indicates_parent_class::doMore(); 
} 

然後調用它像這樣

newMethod(pass_A_somehow); 
newMethod(pass_B_somehow); 

貌似運行時多態性,但並不完全(或者是什麼呢?)......因爲它是一個子類中。 ..

這是設計本身只是垃圾,還有一個更好的方法來實現這一目標?

回答

2

如果這個想法是dodoMore將同時存在於AB,而這些都是該功能特別是你想打電話,你可以 使用模板功能,像這樣:

class X : public A, public B // Also abstract 
{   
    template <typename T> 
    void newMethod() 
    { 
     T::do(); 
     T::doMore(); 
    } 
} 

然後用它明確的,然後你可以做到這一點,像這樣:

X x; 
x.newMethod<A>(); 
x.newMethod<B>(); 

這有額外的好處在編譯時捕獲一些錯誤的,那就是,如果你試圖傳遞一個C已經 的dodoMore功能定義,您將收到一個編譯器錯誤(而不是運行時崩潰)。

這也可以讓你利用std::enable_if功能,如果您使用的是C++ 1X。

希望能有所幫助。

1

就分解出的「通用代碼」,並使之,那麼,常見的有:

class X : public A, public B // Also abstract 
{   
    void foo() { 
     commoncode(); 
     A::do(); 
     A::doMore(); 
    } 
    void bar() { 
     commoncode(); 
     B::do(); 
     B::doMore(); 
    } 

    void commoncode() 
    { 
     // Your common code 
    } 
} 

這是最簡單,直接的方式。另一種替代方式將符合更接近你的「遞給我一些類型的指針」預期的方法:

class X : public A, public B // Also abstract 
{   
    void call_a() 
     A::do(); 
     A::doMore(); 
    } 
    void call_b() 
     B::do(); 
     B::doMore(); 
    } 

    void commoncode(void (X::*ptr)()) 
    { 
     // Your common code 

     (this->*ptr)(); 
    } 
} 

而且參數commoncode()是,要麼

&X::call_a 

&X::call_b 
+0

'常見的代碼()'可能是不把它最好的方式。我只是爲了簡潔起見。通用代碼實際上都是在調用'do()'和'doMore()'的時候。你的第二個建議看起來很有希望我會給它一個! – user2624119