派生到基本隐式指针类型转换

时间:2017-06-29 09:58:35

标签: c++ class c++11 templates polymorphism

对于通用树结构,我使用了一些看起来像这样的代码(以下代码是MCVE):

template <typename T> class Base {
protected:
  Base() {}

public:
  T *ptr;
  void setRelated() { ptr = this; }
};

class Derived : public Base<Derived> {};

int main() {
  Derived d;
  d.setRelated();
  return 0;
}

基本原理:执行此操作的原因是为了使用此类保存开发人员,必须为此类中使用的每个调用和算法将所有内容从基础转换为派生和返回基础是抽象的,不能自己实例化。

此代码无法编译。它说:

main.cpp:7: error: invalid conversion from ‘Base<Derived>*’ to ‘Derived*’ [-fpermissive]
   void setRelated() { ptr = this; }
                   ~~~~^~~~~~

问题:有没有办法让所有转化从Base<Derived>*隐含到Derived*(假设我们不应该重载每个方法)?

1 个答案:

答案 0 :(得分:1)

  

...特别是基础是抽象的,不能自己实例化。

您无法直接提取Base摘要。这需要从另一个派生出来 class(接口),指定纯虚函数 1

  

有没有办法让所有转换从Base *到Derived *隐式(假设我们不应该重载每个方法)?

不,没有。

CRTP的典型习惯用法是使用static_cast

 void setRelated() { ptr = static_cast<T*>(this); }

1 看看STTCL广泛使用该技术的地方。