【发布时间】:2011-11-17 01:07:52
【问题描述】:
我有一堂课:
class Base;
我还有一个界面
class Interface;
接下来我要创建一个类
class Derived : public Base, public Interface;
如果我有Base *object = new Derived;
如何将 object 转换为 Interface ? (当然,如果我知道 object 实际上是一个派生类)
编辑:
我尝试过 dynamic_cast 和 static_cast(未编译)。 所以让我再解释一下这个问题:
我有:
class Object {...}
class ITouchResponder
{
public:
virtual bool onTouchBegan(XTouch *touch) = 0;
virtual void onTouchMoved(XTouch *touch) = 0;
virtual void onTouchEnded(XTouch *touch) = 0;
};
class Ball : public Object, public ITouchResponder {...};
class TentacleSensor : public Object, public ITouchResponder {...}
对象有一个bool touchable_ 属性。如果为真,则对象正在实现 ITouchResponder 接口。
当我使用它时:
bool Level::onTouchBegan(XTouch *touch)
{
...
ITouchResponder *responder = callback.nearestTouchable();
if (responder)
{
if (responder->onTouchBegan(touch))
{
if (responder != ball_)
{
touch->setUserData(responder);
}
}
}
return true;
}
ITouchResponder *QueryCallback::nearestTouchable() const
{
for (list<Object*>::const_iterator it = objects_.begin(); it != objects_.end(); ++it)
{
if ( (*it)->isTouchable() ) return (*it)->asTouchResponder();
}
return 0;
}
asTouchResponder 是Object 的一个方法:
ITouchResponder * Object::asTouchResponder()
{
assert(touchable_);
ITouchResponder *res = dynamic_cast<ITouchResponder*>(this);
assert(res);
return res;
}
我在 xcode 中有严重的过度错误。
但如果我让Object : public ITouchResponder 一切正常。我做错了什么?
完整的对象类:
class Object// : public ITouchResponder
{
public:
struct Def
{
Def()
{
level = 0;
world = 0;
touchable = false;
acceptsContacts = false;
body = 0;
node = 0;
}
Level *level;
b2World *world;
bool touchable;
bool acceptsContacts;
b2Body *body;
XNode *node;
};
Object(const Def &def);
virtual ~Object();
virtual void update(float dt);
bool isTouchable() const {return touchable_;}
void addDependantObject(Object *object);
void removeDependantObject(Object *object);
virtual void objectWillBeRemoved(Object *object) {} //this function is automatically called to every dependant object when object is removed
virtual XVec2 position() const;
virtual float rotation() const;
bool acceptsContacts() const {return acceptsContacts_;}
b2Body *body() const {return body_;}
Level *level() const {return level_;}
b2World *world() const {return world_;}
ITouchResponder *asTouchResponder();
/*
virtual bool onTouchBegan(XTouch *touch) {
return false;
}
virtual void onTouchMoved(XTouch *touch)
{
}
virtual void onTouchEnded(XTouch *touch)
{
}*/
protected:
Level *level_;
b2World *world_;
bool touchable_;
bool acceptsContacts_;
XNode *node_;
b2Body *body_;
list<Object*> dependantObjects_;
};
【问题讨论】:
-
@vivek 不要在 C++ 代码中使用 c 类型转换。引入新语法是有原因的。
-
理想情况下,您可以使用纯虚拟公共接口,而无需通过调用接口指针上的方法进行转换,这些方法在派生类中被覆盖以执行适当的操作。
标签: c++ inheritance casting multiple-inheritance