我对一些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
我怎么能处理这样的事情?
答案 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>();
}
};