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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在没有虚方法的情况下创建派生类的基类?相关的知识,希望对你有一定的参考价值。

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

答案

如果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);

以上是关于如何在没有虚方法的情况下创建派生类的基类?的主要内容,如果未能解决你的问题,请参考以下文章

大型程序的工具——多重继承与虚继承

抽象类

在派生类的构造函数中初始化没有默认构造函数的基类

在 C++ 中将派生类对象分配和访问到基类“指向指针”对象

详解C++中基类与派生类的转换以及虚基类

虚方法抽象方法接口方法