【问题标题】:How to create a derived class of base class with no virtual methods?如何创建没有虚方法的基类派生类?
【发布时间】:2018-03-05 07:57:24
【问题描述】:

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

【问题讨论】:

  • “我有点难过” - 我也是。因为我完全不明白你想要完成什么。
  • 我有一个基类 Driver,它没有虚方法。我有一个程序通过 Driver* 指针使用该对象。我想实现一个继承自 Driver 的类 SimulationDriver。然后在我的软件中,我可以使用具有相同代码的真实驱动程序或 SimulationDriver。
  • 我第一次读。恐怕在评论中再次说明并不能让它更清楚。
  • 恐怕你不能。您当然可以从基类继承,但不能使用多态特性。
  • @Dago -- 可能基类的原作者有意让您从中派生,这就是函数不是虚拟的原因。

标签: c++ inheritance


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-05
    • 1970-01-01
    • 2019-02-07
    • 1970-01-01
    • 2014-01-27
    • 2013-02-21
    相关资源
    最近更新 更多