我目前有这种结构,其中Collider
是一个抽象类。
我想创建另一个抽象类LevelObj
,它应该有一个Collider
。任何继承的LevelObj
类,例如Wall
,都必须进一步定义它需要哪一个碰撞器。然后我想创建一个容器Level
的对象LevelObj
。通过这种方式,我可以从Collider
访问LevelObj
和Level
的所有功能。
然而,这种方法是不可能的,因为LevelObj
不能保存抽象类。即使可能,我也无法改变'他的任何一个孩子中的对象Collider
用于继承的LevelObj
类。
有没有办法达到同样的效果?
答案 0 :(得分:2)
您无法创建抽象类的实例。 ...但是您可以在抽象类中使用指针或指针式类型,在运行时指向派生类的实例(可以实例化,因为它们不是摘要)
所以你可以选择
所有这些都可以指向任何派生类的实例...并将其作为抽象类访问
答案 1 :(得分:1)
然而,这种方法是不可能的,因为LevelObj不能容纳抽象类。
这当然是对的。但是,它可以保存指针或对抽象类对象的引用。实际对象可以嵌入到派生类中,如下所示:
class LevelObj {
public:
Collider &collider;
protected:
LevelObj(Collider &c) : collider(c) {}
};
class Wall : public LevelObj {
private:
ColliderRect wallCollider;
public:
Wall() : LevelObj(wallCollider) {}
};
class Fence : public LevelObj {
private:
ColliderMesh fenceCollider;
public:
Fence() : LevelObj(fenceCollider) {}
};
以上假设LevelObj
的子类是&#34;已婚&#34;对他们的对手。如果不是这样,请在基数中使用unique_ptr<Collider>
,并通过向基类提供指向已分配对象的指针,从派生类的构造函数初始化它。
然后我想创建一个容器
的对象Level
LevelObj
由于LevelObj
是多态的,如果级别对象不在级别之间(或在同一级别内)或{{},则应使用智能指针容器LevelObj
- unique_ptr<LevelObj>
1}}如果以任何方式共享级别对象。