如何在没有虚方法的情况下创建派生类的基类?

时间:2018-03-05 07:57:24

标签: c++ inheritance

所以我有以下情况:我有一个(C ++)驱动程序不在我的控制之下,我有头文件和库文件,但没有源代码。我想在我的SW中模拟驱动程序(不仅仅是测试,而是使用与实际实现相同的代码)。从基类创建派生类并重新实现所有方法很容易,除非驱动程序库中的任何方法都没有标记为虚拟,因此我无法继承它们并且仍然在我的代码中使用相同的基类型。我无法为模拟版本创建自定义标头,因为我希望能够使用相同的代码进行模拟或真正的驱动程序。我有点难过,如何从这个非虚拟基础创建一个派生类?

1 个答案:

答案 0 :(得分:2)

如果Driver不提供虚函数,则使用Driver *的代码使用来自Driver的类的实现是不可能的。

但是,您可以根据驱动程序使用的类型更改您的代码,并使用两个实例,一个用于Driver,另一个用于SimulationDriver(甚至不必从Driver)。请注意,在这种特殊情况下(您知道所有需要的实例化),您可以通过使用显式实例来回避“所有模板代码必须在头文件中”的通常要求。我在我的一个项目中使用类似的东西。

基本上,代码目前看起来像这样:

<强> file.hpp

class Driver;

void process(const Driver *d);

<强> file.cpp

#include "file.hpp"
#include "Driver.h"

void process(const Driver *d)
{
  d->doStuff();
}

将更改为如下所示:

<强> file.hpp

template <class T_Driver>
void process(const T_Driver *d);

<强> file.cpp

#include "file.hpp"
#include "Driver.h"
#include "SimulationDriver.h"

template <class T_Driver>
void process(const T_Driver *d)
{
  d->doStuff();
}

template void process(const Driver *d);
template void process(const SimulationDriver *d);