在c++中创建派生抽象类的实例
Create instance of derived abstract class in c++
我遇到了这个问题,不知道如何解决。
假设我有以下基类:
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
,只需在其他地方初始化该指针,就像你可以在基类的工厂表中注册一个子类一样。
相关文章:
- 无法创建抽象类的实例
- ATL::CComContainedObject<contained>: C2259 无法实例化抽象类
- 如何使用其中一个具体类实例化抽象类?
- 无法实例化抽象类错误
- 无法实例化抽象类,但类不是抽象/派生方法的参数
- C++的研究案例.抽象类和实例
- 'AMA::我的产品':无法实例化抽象类
- 如何在代码中创建抽象类,让蓝图扩展它,并将该蓝图返回给代码进行实例化?
- 无法实例化抽象类
- 如何修复错误C2259:无法实例化抽象类
- 如何通过方法使用抽象类的子实例?
- C++,不能实例化抽象类
- 从抽象类继承的类的实例
- 无法使用多重继承 c++ 实例化抽象类
- 无法实例化抽象类
- 纯抽象类和派生类型的实例化
- 如何在派生实例化之前创建抽象类
- 使用std :: make_shared抽象类实例化的错误
- C++,无法实例化抽象类错误
- 抽象类实例的动态初始化