c++改变继承类

C++ Change Inherited Class

本文关键字:继承 改变 c++      更新时间:2023-10-16

假设我有以下内容

  • A类-主类(不能更改)
  • 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实例中注入BC实例。
只要A的实例将它的请求转发给底层类,派生类是什么并不重要,重要的是它的接口。


回答实际的问题:你不能在运行时改变基类的类型。
如果A继承自B,那就完了。

根据您的评论,有几个答案,但真正的答案是不使用继承。

  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
    };
    

两者都是…策略模式!以某种形式。