2012-10-09 77 views
5
#include <iostream> 
#include <cmath> 
using namespace std; 
class Tcirculo{ 
     float radio; 
     float diametro; 
     float area; 
public: 
     void carea(float r){radio= r; area=(M_PI*((r*r)));} 
     float cdiam(float r) {diametro = 2*r; return diametro;} 
     float getr(){return radio;} 
     float getd(){return diametro;} 
     float geta(){return area;} 

}; 


class Trectangulo : public Tcirculo{ 
     float altura; 
public: 
     float calca(float h, float r){altura =h; 
     float arearec = getd() * h; return arearec;} 
}; 

class Tcilindro : public Tcirculo ,Trectangulo{ 
     float xx,bb; 
public: 
     Tcilindro(float a, float b) {xx=a;bb=b;} 
     float area_total(); 
}; 

float Tcilindro::area_total(){ 
     int area; 
     area = ((2*((getd())))+calca(bb,xx)); 
     return area; 
} 
int main(int argc, char *argv[]) { 

     return 0; 
} 

pero el problema es:herencia de clases ambiguo

warning: direct base 'Tcirculo' inaccessible in 'Tcilindro' due to ambiguity 

En función miembro 'float Tcilindro::area_total()':

error: reference to 'geta' is ambiguous 
error: candidates are: float Tcirculo::geta() 
error:     float Tcirculo::geta() 
error: reference to 'geta' is ambiguous 
error: candidates are: float Tcirculo::geta() 
error:     float Tcirculo::geta() 

Respuesta

2

No hay necesidad de derivar Tcilindro de Tcirculo, es suficiente si lo derivan Trectangulo.

+0

Sí, en este caso creo que debe verificar su diseño. –

1

Estos problemas se deben a la herencia multiplicada con la misma clase base. En su ejemplo, la clase Tcilindro hereda de Trectangulo y Tcirculo pero Trectangulo ya derivada de Tcirculo y Tcilindro tienen la doble definición de las mismas funciones. Solo necesita omitir la clase Tcirculo aquí para eliminar la ambigüedad de las funciones heredadas.

Cuestiones relacionadas