hice un código de prueba de la siguiente manera:ambigüedad en la herencia múltiple de interfaces en C++
#include <iostream>
using namespace std;
#ifndef interface
#define interface struct
#endif
interface Base
{
virtual void funcBase() = 0;
};
interface Derived1 : public Base
{
virtual void funcDerived1() = 0;
};
interface Derived2 : public Base
{
virtual void funcDerived2() = 0;
};
interface DDerived : public Derived1, public Derived2
{
virtual void funcDDerived() = 0;
};
class Implementation : public DDerived
{
public:
void funcBase() { cout << "base" << endl; }
void funcDerived1() { cout << "derived1" << endl; }
void funcDerived2() { cout << "derived2" << endl; }
void funcDDerived() { cout << "dderived" << endl; }
};
int main()
{
DDerived *pObject = new Implementation;
pObject->funcBase();
return 0;
}
La razón por la que escribí este código es para probar si el funcBase función() puede ser llamado en una instancia de DDerived o no. Mi compilador de C++ (Visual Studio 2010) me dio un mensaje de error de compilación cuando intenté compilar este código. En mi opinión, no hay ningún problema en este código porque es cierto que la función funcBase()
se implementará (por lo tanto se anulará) en alguna clase derivada de la interfaz DDerived
, porque es puramente virtual. En otras palabras, cualquier variable de puntero de tipo Implementation *
se debe asociar con una instancia de una clase derivando Implementación y anulando la función funcBase()
.
Mi pregunta es, ¿por qué el compilador me da tal mensaje de error? Por qué la sintaxis de C++ se define así; es decir, ¿tratar este caso como un error? ¿Cómo puedo hacer que el código se ejecute? Quiero permitir herencia múltiple de interfaces. Por supuesto, si uso "público virtual" o volver a declarar la función funcBase()
en Implementation
como
interface DDerived : public Derived1, public Derived2
{
virtual void funcBase() = 0;
virtual void funcDDerived() = 0;
};
entonces todo funciona sin ningún problema.
Pero no quiero hacer eso y buscar un método más conveniente, porque la herencia virtual puede degradar el rendimiento, y la nueva declaración es tan tediosa de hacer si las relaciones de herencia de las clases son muy complejas. ¿Hay algún método para habilitar la herencia múltiple de interfaces en C++ que no sea la herencia virtual?
Mis poderes psíquicos me dicen que el error es llamar a la función de clase base ambigua. –
Pero no es una clase base, es una interfaz base o una estructura base. –
posible duplicado de [C++ Herencia múltiple - ¿por qué no trabaja?] (Http://stackoverflow.com/questions/5864466/c-multiple-inheritance-why-you-owork) –