我认为缺少一条重要信息:非专业方法是否覆盖了TBase
类的虚拟方法?这是这里的中心问题。
如果没有,那么您可以为非专业方法创建另一个类,并从您的CTemplateInherit
类中的两个类(公开)继承。问题解决了。
然而,如果非特化方法覆盖了 TBase 类的虚方法,那么它只会稍微复杂一些:
解决方案 1) 将所有非专用函数重新组合到一个“详细”标题中。作为一组(非模板)自由函数(如果将输入输出作为参数传递足够容易的话)或作为具有它所需的非专业数据成员的(非模板)类。然后,在相应的 cpp 文件(稍后将其编译到 DLL 中)中定义所有这些函数(实现它们)。
然后,在您的CTemplateInherit
类模板中,只需将非专用函数调用转发到“详细”函数集。因为模板默认内联,所以开销为零。如果您需要将“详细”函数重新组合到一个类(非模板)中,那么只需使用private
继承,防止函数名冲突。然后,您可以像访问任何其他继承的数据成员一样访问“详细”类的数据成员,并且可以将非专用函数调用转发到可以编译成 DLL 的“详细”类实现(如果您有适合从 DLL 导出类的框架(因为普通 C++ 没有可靠的机制),但您的问题似乎暗示您这样做)。
这个解决方案的唯一问题是创建几个简单的转发函数很烦人。但是恕我直言,在 DLL 中隐藏实现是一个合理的价格(几乎任何时候你想这样做,你最终都会编写一堆包装函数)。
解决方案2)如果基类中有一组非专用虚函数,那么该子集肯定不依赖于实际类型TBase
(我的意思是,没有它也可以形成这些函数的原型)。然后,这意味着您可以将该函数子集重新组合到另一个TBase
预期继承自的基类中。让我们称之为TNonSpecialBase
。此时,您可以设置以下层次结构:
class TNonSpecialBase {
// set of pure-virtual functions that are not special.
};
// this is an example of a class that could act as a TBase:
class TExampleBase : public virtual TNonSpecialBase {
// set of virtual functions that are special to TExampleBase.
};
class CNonSpecialDerived : public virtual TNonSpecialBase {
// declaration of non-specialized functions that override the function in TNonSpecialBase.
};
template <typename TBase>
class CTemplateInherit : public TBase, public CNonSpecialDerived {
// set of virtual functions that are specialized for the template argument TBase.
};
通过上述设置,专用函数必须在 的头文件中结束CTemplateInherit
,但重新组合的非专用函数CNonSpecialDerived
可以在单独的 cpp 文件中定义(并编译成 DLL)。这里的魔术是使用虚拟继承来允许最终类为基类拥有一个虚拟表TNonSpecialBase
。换句话说,这允许类CNonSpecialDerived
覆盖 TBase 中继承自 的虚函数TNonSpecialBase
,只要 TBase 不覆盖这些函数中的任何一个(在这种情况下,编译器会称其为模棱两可)。这样,用户可以处理指向TBase
对象的指针,调用它的任何虚函数,这将导致向CTemplateInherit
实现(专用)或CNonSpecialDerived
实现(大概在 DLL 中)。