C ++更改继承的类

时间:2016-11-09 00:58:18

标签: c++ polymorphism

所以说我有以下

  • A类 - 主类(不能改变)
  • B类 - 基类
  • C类 - 替代基类

A类定义为

Class A : public Class B
{};

我将如何以编程方式更改它以使其成为Class A : public Class C

理由是我希望C类是用于单元测试目的的B类简化版本。所以我需要一种方法来生成一个A类版本,而不修改A类,然后使用C类的方法,而不是B类。

希望这有意义吗?

2 个答案:

答案 0 :(得分: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 {};

这样做,您可以在软件中引入一个触发器,只是强制在B的实例中注入CA的实例。
只要A的实例将其请求转发给基础类,与派生的请求无关,那么它的界面就很重要。

回答实际问题:您无法在运行时更改基类的类型 如果A继承自B,那就是全部。

答案 1 :(得分: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
    };
    
  3. 两者都是......战略模式的例子!以某种形式或其他形式。