2016-11-09 61 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 
    }; 
    

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