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

Calling a method from a derived class object that returns a base class pointer

本文关键字:对象 调用 方法 派生 返回 基类 指针      更新时间:2023-10-16

我对一些 c++ OOP 概念有误解,例如,如果我有一个返回指向同一类对象的指针的 base 类,请说:

class base{
public:
    int baseVal;
    base* foo(){
        return new base;
    }
}

以及继承方法 foo()derived 类:

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

我的问题是"当我从derived对象调用方法foo()时会发生什么?有没有办法 - 而不是覆盖 - 让它返回一个derived的对象而不是base?"例如:

int main(){
    derived obj1;
    derived * obj2P = obj1.foo();
    cout << obj2P->derivedVal << endl;
    return 0;
}

我该如何处理这样的事情?

您可以使用模板化基类实现所需的目标。

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>();
  }
};