从派生类对象调用方法,该方法返回基类指针

时间:2017-10-28 03:58:39

标签: c++ oop inheritance

我对一些c ++ OOP概念存在误解,例如,如果我有一个a = [1,2,3,4] b = a[:] b[0] = 10 print a 类,它返回指向同一个类的对象的指针,请说:

base

和继承方法class base{ public: int baseVal; base* foo(){ return new base; } } 的{​​{1}}类:

derived

我的问题是“当我从foo()对象调用方法class derived : public base{ public: int derivedVal; //some other members } 时会发生什么?有什么办法 - 而不是覆盖 - 使它返回foo()的对象不是derived?“例如:

derived

我怎么能处理这样的事情?

1 个答案:

答案 0 :(得分:2)

您可以使用模板化基类实现您想要的效果。

template<typename derived_t>
class base {
public:
  derived_t* foo() {
    return new derived_t;
  }
};

class derived : public base<derived> {
public:
  int derivedVal;
  //some other members
};

另见CRTP模式。

虽然返回一个拥有的原始指针通常是不好的做法,你应该更喜欢返回像unique_ptr这样的智能指针:

template<typename derived_t>
class base {
public:
  std::unique_ptr<derived_t> foo() {
    return std::make_unique<derived_t>();
  }
};