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

लेकिन समस्या है:अस्पष्ट वर्ग विरासत

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

सदस्य समारोह में '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() 

उत्तर

2

Tcirculo से Tcilindro प्राप्त करने के लिए कोई जरूरत नहीं है, यह पर्याप्त है अगर आप इसे से निकाले जाते हैं Trectangulo

+0

हाँ, इस मामले में मुझे लगता है कि आपको अपना डिज़ाइन जांचना होगा। –

1

ये समस्याएं समान बेस कक्षा के साथ विरासत में गुणा करने की वजह से हैं। आप में TcilindroTrectangulo और Tcirculo से 0 विरासत से Trectangulo पहले से ही Tcirculo और Tcilindro से प्राप्त किए गए समान कार्यों की डबल परिभाषा है। विरासत कार्यों की अस्पष्टता को दूर करने के लिए आपको बस Tcirculo कक्षा छोड़ने की आवश्यकता है।

संबंधित मुद्दे