tengo una clase:C++ herencia múltiple fundición
class Base;
También tengo una interfaz
class Interface;
siguiente estoy creando una clase
class Derived : public Base, public Interface;
Si tengo Base *object = new Derived;
¿Cómo puedo emitir object
a Interface
? (Por supuesto, si sé que el objeto es en realidad una clase derivada)
EDIT:
He intentado dynamic_cast y static_cast (no compilado). Así que vamos a explicar el problema un poco más:
que tengo:
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 {...}
objeto tiene una propiedad bool touchable_
. Si es cierto, entonces el objeto implementa la interfaz ITouchResponder.
cuando lo uso:
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
es un método de Object
:
ITouchResponder * Object::asTouchResponder()
{
assert(touchable_);
ITouchResponder *res = dynamic_cast<ITouchResponder*>(this);
assert(res);
return res;
}
tengo mal el exceso de error en Xcode.
Pero si hago Object : public ITouchResponder
todo funciona bien. Qué estoy haciendo mal ?
completa clase de objeto:
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_;
};
(derived *) object – vivek
@vivek No utilice c cast en código C++. Hay una razón por la cual se introdujo la nueva sintaxis. – RedX
Idealmente, su interfaz pública virtual pura podría utilizarse sin la necesidad de invocación mediante métodos de llamada en el puntero de interfaz que se anulan en la clase derivada para hacer lo que sea apropiado. – AJG85