首页 > 解决方案 > 在 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)类一起使用,一切都会正常工作。

解决这种情况的正确方法是什么?

标签: c++11templatesc++14

解决方案


a构造时,首先构造Base<Helper2>基础对象。该构造函数将调用Base::createT,这需要Helper2有一个带有一个参数的构造函数。由于那不存在,因此您会收到编译错误。

构造Derived<Helper>对象时,会创建两个Helper对象:一个由Base的构造函数创建,存储在 中_pTBase,另一个由Derived<Helper>的构造函数创建,存储在_pTDerived.

解决此问题的一种方法是让派生类调用(非虚拟Create函数,然后将返回的指针传递给基类构造函数。


推荐阅读