c++ - 如何创建没有虚方法的基类的派生类?

标签 c++ inheritance

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

最佳答案

如果 Driver 不提供虚函数,那么使用 Driver * 的代码使用从 Driver 派生的类的实现是不可能的.

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

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

文件.hpp

class Driver;

void process(const Driver *d);

文件.cpp

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

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

会变成这样:

文件.hpp

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

文件.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++ - 如何创建没有虚方法的基类的派生类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49105779/

相关文章:

c++ - 计算接触两点的圆心

c++ - 关于 C++ 模板

c++ - 将 Qimage 转换为 Mat opencv 时出错

javascript - JavaScript 中的原型(prototype)链

c# - 针对此问题的适当设计/设计模式?

javascript - 如何在没有第三个对象垫片的情况下进行继承?

java - 类型转换和继承中向上/向下转换的区别[Java]?

c++ - 如何使用 void `null` 或 `empty` 类元素扩展 C++ 结构/类

java - 密码破解

C# 覆盖/添加方法/字段到对象