c++11 - 在 C++11/14 中覆盖派生的模板类方法
问题描述
我需要用具有不同数量输入参数createT()
的Base
模板类中的方法覆盖模板类的方法。Derived
我开发了这个非常简单的例子:
#include <iostream>
class Helper
{
public:
Helper(std::string s): _s(s)
{}
void display()
{
std::cout << _s << std::endl;
}
private:
std::string _s;
};
class Helper2
{
public:
Helper2(std::string s, int i):
_s(s), _i(i)
{}
void display()
{
std::cout << _s << " + " << std::to_string(_i) << std::endl;
}
private:
std::string _s;
int _i;
};
template<class T> class Base
{
public:
Base()
{
_pTBase = createT();
}
void test()
{
_pTBase->display();
}
protected:
/// Subclasses can override this method.
virtual T* createT()
{
return new T("### BASE ###");
}
private:
T* _pTBase;
}; //template<class T> class Base
template<class T> class Derived : public Base<T>
{
public:
Derived() : Base<T>()
{
_pTDerived = createT();
}
void test()
{
_pTDerived->display();
}
protected:
virtual T* createT()
{
return new T("### DERIVED ###", 5);
}
private:
T* _pTDerived;
}; //template<class T> class Derived : public Base<T>
int main()
{
Derived<Helper2> a;
a.test();
return 0;
}
当我尝试编译时,我收到此消息:
error: no matching function for call to ‘Helper2::Helper2(const char [13])’
return new T("### BASE ###");
^
似乎编译器无法使用createT()
派生类中的方法。
当然,如果我将Base
类与Helper
(而不是Helper2
)类一起使用,一切都会正常工作。
解决这种情况的正确方法是什么?
解决方案
a
构造时,首先构造Base<Helper2>
基础对象。该构造函数将调用Base::createT
,这需要Helper2
有一个带有一个参数的构造函数。由于那不存在,因此您会收到编译错误。
构造Derived<Helper>
对象时,会创建两个Helper
对象:一个由Base
的构造函数创建,存储在 中_pTBase
,另一个由Derived<Helper>
的构造函数创建,存储在_pTDerived
.
解决此问题的一种方法是让派生类调用(非虚拟)Create
函数,然后将返回的指针传递给基类构造函数。
推荐阅读
- html - 如何在 html 文本搜索中忽略短代码
- django - 有条件地返回 def __str__(self)
- c# - Xamarin iOS UIAlertController 未显示
- javascript - 如何将颜色更改为数组字符串中的特定单词?: Javascript/ jQuery
- html - 嵌套 div 高度和溢出
- java - 如何创建正确的“this”对象作为参数?
- javascript - 在 JS 和 html 中添加 off 选项值
- firebase - 单击 ServiceWorker 通知打开浏览器
- git - 反转分支差异 (Git)
- c++ - constexpr 指向处理器固定地址的指针