在 C++ 的孙子类中覆盖模板参数?

Posted

技术标签:

【中文标题】在 C++ 的孙子类中覆盖模板参数?【英文标题】:Overriding a template argument in grandchild class in C++? 【发布时间】:2020-09-09 16:02:51 【问题描述】:

我有以下层次结构

template<class SettingsType>
    class TemplatedBase;

class A : public TemplatedBase<SettingsTypeA>;

class B : public A;

class SettingsTypeA;

class SettingsTypeB : public SettingsTypeA;

有没有办法覆盖B 中的模板特化,使其继承自A,同时将模板特化SettingsType 设置为SettingsTypeB

【问题讨论】:

感觉像 XY 问题。你到底想达到什么目的?你可以修改多少代码?无论您想做什么,都可以通过对 A 和/或 B 进行一些修改来实现。 @DanM.,这是一个更复杂的问题。我有一个代码库,其中编写了 A 类,然后有人决定根据不同的设置,相同的策略,只是不同的设置类型,它的实现可以用于不同的事情。因此,他在构造函数中传递的参数上添加了条件检查以选择正确的 settingType,但系统依赖于传递的模板参数 SettingsType 来实例化需要的几个对象。 你能改变A的实现吗?我也不确定我是否理解“在构造函数中进行条件检查以选择正确的设置类型”如何与模板参数啮合。 【参考方案1】:

一个简单的改变是模板A,同时给它一个默认值:

template<typename T = SettingsTypeA>
class A : public TemplatedBase<T> ;

然后当B继承自A时就可以使用需要的类型了:

class B : public A<SettingsTypeB> ;

【讨论】:

但是class A : public TemplatedBase&lt;SettingsTypeB&gt; 有意义/编译吗?这个问题的措辞好像没有,但信息不足以决定。 @DanM。事情需要以正确的顺序声明,但除此之外,它似乎还不错。 我试过这个,但我得到了Class A is not a template type 似乎fine。只需要重新排序,然后添加 嗯,错误确实存在,因为该类的另一个文件中有不必要的前向声明。我删除了它,它按预期工作。我也确实使用了显式模板实例化,因为我知道子类是有限的,并且只使用了一个已知的子集。【参考方案2】:

没有。 模板不是一个类。这是一个模板

TemplatedBase&lt;SettingsTypeA&gt; 是模板的特定实例化——它只是常规的Foo 类。除此之外没有什么特别之处。

所以您的问题相当于询问您是否可以在下面的示例中将C 更改为D

class A : public C;

class B : public A;

【讨论】:

以上是关于在 C++ 的孙子类中覆盖模板参数?的主要内容,如果未能解决你的问题,请参考以下文章

在模板基类中为继承类中的可选覆盖生成虚拟方法

在子类中密封方法,因此孙子不能覆盖它

如何覆盖 C++ 类中的 bool 运算符?

c++部分面试题

C++重载隐藏和覆盖的区别

继承类中的c ++成员变量类型覆盖