2016-11-09 67 views
-2

類所以說我有以下c + +變化繼承

  • A類 - 主類(不能改變)
  • B類 - 基類
  • C類 - 替代基類

A類定義爲

Class A : public Class B 
{}; 

如何我是否會以編程方式改變它,以便改爲Class A : public Class C

推理是我希望C類是單元測試目的的B類的殘缺簡約版本。所以我需要一種方法來產生A類的一個版本,而不用修改A類,然後使用C類的方法而不是B類。

希望這有道理嗎?

+1

簡短的回答是:你不能。 C++不能以這種方式工作。 –

+1

這不是靜態類型系統的工作原理。 – DeiDei

+2

這個怎麼樣。將兩個類都命名爲'B',但要配置您的項目或構建系統以確保其中只有一個被使用。 –

回答

1

您可以使用模板,並在編譯時改變它:

template<typename T> 
class AT: public T { /* ... */ }; 

現在在什麼地方,你可以這樣做:

#ifdef DEBUG 
using A = AT<C>; 
#else 
using A = AT<B>; 
#endif 

否則,如果你想這樣做,在運行時,你應該寧願使用超過組成繼承,作爲一個例子:

struct A { 
    I subclass; 
}; 

// ... 

struct B: I {}; 
struct C: I {}; 

這樣做,你可以引入一個觸發在你的軟件中,只需要在A的實例中強制注入BC的實例。
只要A的實例將其請求轉發給基礎類,那麼派生的類是什麼並不重要,它的接口很重要。


要回答實際問題:您不能在運行時更改基類的類型。
如果A繼承自B,就是這樣。

0

根據你的評論,有幾個答案,但真正的答案是不使用繼承。

  1. 使用組成:

    class wrapper 
    { 
        thing_you_want_to_mock& thingie; 
    
        // all the wrapped functionality 
    }; 
    

    在這裏你可以創建一個模擬thing_you_want_to_mock,並測試與模擬對象的包裝。這裏的問題是,我假設thing_you_want_to_mock有一個可覆蓋的界面,這可能不是你的情況。

  2. 使用模板組成:

    template<typename ThingYouWantToMock> 
    class wrapper 
    { 
        ThingYouWantToMock thing; 
    
        // Wrapper functions that call functions on thing 
    }; 
    

兩者都是...策略模式的例子!以某種形式或其他形式。