gpt4 book ai didi

c++ - 如何 "skip"某些子类函数

转载 作者:行者123 更新时间:2023-11-28 02:47:31 25 4
gpt4 key购买 nike

我不确定如何准确地命名它,但我正在尝试找出具有多态性的东西。

所以基本上,我想要一个父类(对象)的数组,其中包含一堆它的子类(可碰撞和不可碰撞的)。但是,我希望能够将这个数组放入一个循环中,并只为可碰撞的子类运行碰撞函数,但是由于另一个子类没有碰撞函数,我该怎么做呢?

(看起来像这样)

class Object
{
protected:
Image image; // Pseudo code to make point
public:
void Collision() = 0;

//Constructor/Destructor
Object(void);
~Object(void);

};

class Collidable : Object
{
private:
Position myPosition; // Pseudo code to make point
public:
void Collision(); // Has collision function for parent class

//Constructor/Destructor
Collidable(void);
~Collidable(void);
};

class Uncollidable : Object
{
private:
Position myPosition; // Pseudo code to make point
public:
// No collision function for parent class

//Constructor/Destructor
Uncollidable(void);
~Uncollidable(void);
};

int main()
{
Collidable collide1, collide2, collide3;
Uncollidable uncollide1, uncollide2, uncollide3;
Object *objects[] { collide1, collide2, uncollide1, uncollide2, uncollide3, collide3 };

for(int i = 0; i < 6; i++)
{
objects[i].Collide(); // Should not work.
}

return 0;
}

^(这只是一个帮助展示我的问题的例子,请原谅一些语法错误)

不过,我很确定,由于 Uncollidable 类中不存在 void Collide(),因此类似这样的事情将是一个错误。那么我怎样才能在循环中运行 void Collide() 函数同时避免错误呢?或者这样的事情是不可能的,我只需要制作两个单独的数组?

我希望我能很好地解释我的问题。

(我试图研究这个,但每次我尝试的时候我都被送到了多态性的基础知识)

最佳答案

你可以这样做:

for(int i = 0; i < 6; i++)
{
Collidable c = dynamic_cast<Collidable*>(objects[i]);

if(c != nullptr) // dynamic_cast will return null if objects[i] is not of type Collidable
c->Collide(); // Should work.
}

在你的代码中有一个错误,你在 Object 类中创建了 Collide() pure virtual,但你不是 Uncollidable 中覆盖它。不起作用。在 Uncollidable覆盖它(这是不合适的),或者给 Object::Collide() 一个默认的主体(这也是不合适的) .

有一个更好的设计,将所有通用接口(interface)放在Object中,将不同的行为分离出在其他接口(interface)中。它将导致良好的 OO 设计(符合 IS-A 关系)

class Object
{
protected:
Image image; // Pseudo code to make point
public:
Object(void);
~Object(void);
//other common interface
};

class Collidable // this is an interface that represent 'collidable' behavior
{
public:
virtual void Collision() = 0;
}


class CollidableObject : public Object, public Collidable
{ ... }

class UncollidableObject : public Object
{ ... }

注意 Object必须public继承,否则你将无法对待对象os CollidableObjectUncollidableObject 作为 Object 的对象。

关于c++ - 如何 "skip"某些子类函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23946193/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com