我对新的智能指针有点困惑。我想用一个指针指向同级类(同一个父类)的两个不同对象。
所以基本上我有一个父类
Parent
和两个子类Child1
和Child2
class Parent{
virtual void foo() = 0;
};
class Child1 : public Parent{
void foo(){
//something
}
}
class Child2 : public Parent{
void foo(){
//something different
}
}
指针say
ptr
首先指向Child1
,然后它应该指向Child2
我想,
Parent ptr = new Child1()
一种非智能指针方式,如果我这样做,应该在这种情况下工作(Child2 *)ptr
但我确信通过智能指针会有更好的方法。
我知道 reinterpret_ptr 确实有一些围绕这个主题的用例,但我无法理解 gfg 的解释。另外我的主要问题是如何声明这个指针?
unique_ptr<Parent> ptr = make_unique<Child1>();
?
Parent ptr = new Child1()
不会编译,因为 ptr
未声明为指针。您需要添加一个*
,例如:
Parent *ptr = new Child1();
现在,
(Child2 *)ptr
是未定义行为,因为Child1
对象不是有效的Child2
对象,反之亦然,所以你不能只对指针进行类型转换。您需要指向一个完整的单独的 Child2
对象,例如:
Parent *ptr = new Child1();
...
delete ptr;
ptr = new Child2();
...
delete ptr;
不要忘记向
virtual
添加 Parent
析构函数!
现在,您可以使用智能指针做同样的事情,例如:
unique_ptr<Parent> ptr = make_unique<Child1>();
...
ptr = make_unique<Child2>();