类所以说我有以下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',但要配置您的项目或构建系统以确保其中只有一个被使用。 –