2012-10-09 12 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; 
} 

aber das Problem ist:Mehrdeutige Klassenvererbung

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

In Memberfunktion '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() 

Antwort

2

Es besteht keine Notwendigkeit Tcilindro von Tcirculo abzuleiten ist, reicht es aus, wenn Sie es ergeben sich aus Trectangulo.

+0

Ja, in diesem Fall denke ich, dass Sie Ihr Design überprüfen müssen. –

1

Diese Probleme wegen mehrfacher Vererbung mit derselben Basisklasse. In Ihrem Beispiel erbt die Klasse Tcilindro von Trectangulo und Tcirculo aber Trectangulo bereits von Tcirculo und Tcilindro abgeleitet haben Doppeldefinition der gleichen Funktionen. Sie müssen nur die Klasse Tcirculo hier weglassen, um die Mehrdeutigkeit der vererbten Funktionen zu entfernen.