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

时间:2015-07-10 14:22:04

标签: c++ oop inheritance abstract-class instantiation

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

假设我有这些基类:

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

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

EDITED: 我无法访问类Value

中的派生类NodeBase

2 个答案:

答案 0 :(得分:5)

添加创建成员函数:

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

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

派生类实现它:

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

此模式的更常见形式是 clone 函数,但它不会生成相同类型的默认构造对象,而是 copy :< / p>

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

答案 1 :(得分:1)

如果不改变类定义,我认为没有办法。然而,有许多方法涉及改变类定义,这取决于你是什么&#34;允许&#34;使用。

一个。将DateTime lastSyncTime = db.Table<SyncAudit>().AsEnumerable() // Do the rest of the processing in memory .Select(c => DateTime.Parse(c.SyncTime)) .OrderByDescending(dt => dt) .FirstOrDefault(); return lastSyncTime; 模板化为应创建的对象类型:

AddValue()

B中。创建创建 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); 的函数(如果需要,将任何参数转发给构造函数Value AddValue`:

) and pass it as an argument to

(也可以在这里使用仿函数或lambda)

℃。您可以在 // 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); 中创建一个返回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,只需在其他地方初始化该指针,就像你可以在基类的工厂表中注册子类一样