Hay dos clases base que tienen el mismo nombre de función. Quiero heredar ambos, y sobre montar cada método de manera diferente. ¿Cómo puedo hacer eso con una declaración y definición por separado (en lugar de definir en la definición de la clase)?Heredar interfaces que comparten un nombre de método
#include <cstdio>
class Interface1{
public:
virtual void Name() = 0;
};
class Interface2
{
public:
virtual void Name() = 0;
};
class RealClass: public Interface1, public Interface2
{
public:
virtual void Interface1::Name()
{
printf("Interface1 OK?\n");
}
virtual void Interface2::Name()
{
printf("Interface2 OK?\n");
}
};
int main()
{
Interface1 *p = new RealClass();
p->Name();
Interface2 *q = reinterpret_cast<RealClass*>(p);
q->Name();
}
no pude mover la definición en VC8. He encontrado la palabra clave específica __interface Microsoft puede hacer este trabajo con éxito, código de abajo:
#include <cstdio>
__interface Interface1{
virtual void Name() = 0;
};
__interface Interface2
{
virtual void Name() = 0;
};
class RealClass: public Interface1,
public Interface2
{
public:
virtual void Interface1::Name();
virtual void Interface2::Name();
};
void RealClass::Interface1::Name()
{
printf("Interface1 OK?\n");
}
void RealClass::Interface2::Name()
{
printf("Interface2 OK?\n");
}
int main()
{
Interface1 *p = new RealClass();
p->Name();
Interface2 *q = reinterpret_cast<RealClass*>(p);
q->Name();
}
pero ¿hay otra manera de hacerlo algo más general que funcionará en otros compiladores?
¿Por qué quiere esto? Parece que estás derrotando el propósito de las funciones virtuales; simplemente estás replicando la semántica no virtual. ¿Tiene una referencia para '__interface'? Lo busqué y no parece hacer nada esencial. – Potatoswatter
Agregué el __interface. – Gohan
Potatoswatter: la razón por la que podría necesitar hacer esto es porque podría tener una clase que reúna dos conceptos diferentes heredando desde dos interfaces. Los usuarios de la clase probablemente lo utilicen a través de las interfaces y los usuarios de las dos interfaces diferentes no se conozcan ni se preocupen entre sí. La clase los combina y necesita diferenciar entre llamadas en una interfaz y llamadas en la otra. De ninguna manera estás derrotando el propósito de las funciones virtuales. Gohan - Me sorprendería si __inteface hiciera una diferencia aquí. –