類所以說我有以下c + +變化繼承
- A類 - 主類(不能改變)
- B類 - 基類
- C類 - 替代基類
A類定義爲
Class A : public Class B
{};
如何我是否會以編程方式改變它,以便改爲Class A : public Class C
?
推理是我希望C類是單元測試目的的B類的殘缺簡約版本。所以我需要一種方法來產生A類的一個版本,而不用修改A類,然後使用C類的方法而不是B類。
希望這有道理嗎?
類所以說我有以下c + +變化繼承
A類定義爲
Class A : public Class B
{};
如何我是否會以編程方式改變它,以便改爲Class A : public Class C
?
推理是我希望C類是單元測試目的的B類的殘缺簡約版本。所以我需要一種方法來產生A類的一個版本,而不用修改A類,然後使用C類的方法而不是B類。
希望這有道理嗎?
您可以使用模板,並在編譯時改變它:
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
的實例中強制注入B
或C
的實例。
只要A
的實例將其請求轉發給基礎類,那麼派生的類是什麼並不重要,它的接口很重要。
要回答實際問題:您不能在運行時更改基類的類型。
如果A
繼承自B
,就是這樣。
根據你的評論,有幾個答案,但真正的答案是不使用繼承。
使用組成:
class wrapper
{
thing_you_want_to_mock& thingie;
// all the wrapped functionality
};
在這裏你可以創建一個模擬thing_you_want_to_mock
,並測試與模擬對象的包裝。這裏的問題是,我假設thing_you_want_to_mock
有一個可覆蓋的界面,這可能不是你的情況。
使用模板組成:
template<typename ThingYouWantToMock>
class wrapper
{
ThingYouWantToMock thing;
// Wrapper functions that call functions on thing
};
兩者都是...策略模式的例子!以某種形式或其他形式。
簡短的回答是:你不能。 C++不能以這種方式工作。 –
這不是靜態類型系統的工作原理。 – DeiDei
這個怎麼樣。將兩個類都命名爲'B',但要配置您的項目或構建系統以確保其中只有一個被使用。 –