在c++中创建派生抽象类的实例

Create instance of derived abstract class in c++

本文关键字:抽象类 实例 派生 创建 c++      更新时间:2023-10-16

我遇到了这个问题,不知道如何解决。

假设我有以下基类:

class ValueBase
{
    private:
    int base_value;
    public:
    int GetValue();
    void SetValue(int val);
    virtual ValueBase* Meet(ValueBase* const a, ValueBase* const b) = 0;
}
class NodeBase
{
    private:
    ValueBase* base_nodeValue;
    public:
    bool AddValue(int val);
}

和派生类:

class Value : public ValueBase
{
    public:
    Value* Meet(ValueBase* a, ValueBase* b) override;
}

有没有办法在类NodeBase的方法AddValue中创建类Value的实例?我知道我可能应该让AddValue成为纯虚拟的,并在NodeBase的派生类中实现它,但如果没有这个选项,有可能做到吗?我可以在Value中使用例如template方法或回调方法来构造该对象吗?还是这样做太邪恶了?

编辑时间:我无法访问类NodeBase 中的派生类Value

添加创建成员函数:

class ValueBase
{
public:
    virtual ValueBase * create() = 0;
    // ...
};

然后在NodeBase中可以使用base_nodeValue->create()

派生类实现它:

class Value : public ValueBase
{
    Value * create() override { return new Value; }
};

不过,这种模式更常见的形式是克隆函数,它不会生成相同类型的默认构造对象,而是复制:

Derived * clone() override { return new Derived(*this); }

如果不更改类定义,我看不到任何方法。然而,有许多方法涉及更改类定义,这取决于"允许"使用什么。

A。将AddValue()模板化为它应该创建的对象类型:

 class NodeBase
 {
    private:
    ValueBase* base_nodeValue;
    public:
    template<class ValueType>
    bool AddValue(int val) { base_nodeValue = new ValueType; }
 }
 ...
 // other code that has access to Value
 node.AddValue<Value>(10);

B。创建创建Value的函数(如果需要,将任何参数转发给构造函数) and pass it as an argument to AddValue`:

 // might need to adapt syntax
 class NodeBase
 {
    private:
    ValueBase* base_nodeValue;
    public:
    bool AddValue(int val, ValueBase* (*creator)()) { base_nodeValue = (*creator)(); }
 }
 ...
 // other code that has access to Value
 ValueBase* valueCreator() { return new Value; }
 ...
 node.AddValue(10, valueCreator);

(这里也可以使用函子或lambda(

C。您可以在ValueBase中创建一个返回Value*的函数。

class ValueBase
{
    public:
    static ValueBase* createValue();
};
class NodeBase
{
    private:
    ValueBase* base_nodeValue;
    public:
    bool AddValue(int val) { base_nodeValue = ValueBase::createValue(); }
};
// in a separate cpp
ValueBase* ValueBase::createValue() { return new Value; }

这实际上类似于工厂方法:你可以让createValue()接受一个参数,并根据它创建不同的ValueBase。让ValueBase存储一些指向创建者函数的指针,你可以让它根本不知道Value,只需在其他地方初始化该指针,就像你可以在基类的工厂表中注册一个子类一样。