【发布时间】:2020-09-06 13:03:26
【问题描述】:
问题总结
我不知道如何通过函数(不是构造函数)使用 new-operator 创建派生类的对象,并让基类指针指向它。
设置
我的项目中有一个抽象基类和一个派生类:
class Base
{
// stuff
};
class Derived : public Base
{
//stuff
//constructor:
Derived(args);
};
我也有返回Derived 对象的函数。
Derived func(args);
在某个时候,我声明了一个基类指针
Base* ptr = { nullptr };
我希望它稍后指向 Derived 对象。
我想要什么
我想使用func 创建一个Derived 对象,并能够在后面的代码中通过指针ptr 访问它。
到目前为止我做了什么
我知道使用派生类的构造函数是可行的
ptr = new Derived(args);
或者只是它的默认构造函数,如果它存在的话
ptr = new Derived;
但是,我有充分的理由不能在我的例子中使用构造函数,因为派生对象的配置更复杂。在这种情况下,我想用函数func 创建这个对象。
我知道这个,
ptr = new func(args);
不起作用,因为 new 需要一个类型。我怎样才能实现这样的行为?
提前感谢您的任何建议和有用的回复。
注意:我正在使用new,因为我需要访问Derived 对象也在其创建范围之外。
【问题讨论】:
-
你能重写
func,使它返回Derived*而不是Derived吗?如果是这样,不要忘记制作Basevirtual 的析构函数。你也可以写Derived d = func(args); ptr = &Derived;,只是它有点脆弱,因为d必须比ptr的任何取消引用都长。 -
感谢您的及时回复。问题确实是
d不会比指针寿命长,这就是我到目前为止使用new的原因。 -
从
func返回一个指针可能是最好的选择,但如果你不能修改func,那么ptr = new Derived(func(args))可能会起作用。 -
@Mestkon 这可能值得作为答案发布。
-
@user157765 复制构造函数或移动构造函数
标签: c++ pointers inheritance derived-class base-class