2016-04-22 19 views
-8

ich nicht die diffrence zwischen Polymorphismus und Vererbung verstehen ... Sie Litterarly das gleiche tun ...Polymorphismus vs Vererbung. Diffrence?

einfaches Beispiel Polymorphism:

class shape { 
    public: 
     void setValues(int height_, int width_) { 
      height = height_, width = width_; 
     } 
    protected: 
     int height, width; 

    private: 

    }; 

    class rectangle :public shape, public ThreeDView{ 
    public: 
     int area() { 
      return(shape::height*shape::width); 
     } 
     float threeDArea() { 
      return(((shape::height*shape::width)/2)*(std::cos(Z_LENGTH))); 
     } 
    }; 

class ThreeDView{ 
public: 
    void setZLength(int value) { 
     Z_LENGTH = value; 
    } 

    int setCompact(bool ans) { 
     compact = ans; 
    } 

    float getZLength() { 
     return Z_LENGTH; 
    } 

    bool getCOMPACT() { 
     return compact; 
    } 
protected: 
    float Z_LENGTH; 
    bool compact; 

private: 
    unsigned char ZCHAR = 'Z'; 
}; 


    class triangle :public shape { 
    public: 
     int area() { 
      return((shape::height * shape::width)/2); 
     } 
    }; 

    int main(){ 
    rectangle rect2; 
     triangle trng2; 
     shape *poly = &rect2; 
     shape *poly2 = &trng2; 

     poly->setValues(2,3); 
     poly2->setValues(5,4); 
     std::cout << "AREA : " << trng1.area() << "AREA RECT : \n" <<rect1.area() << std::endl; 
    } 

Above Beispiel Vererbung übersetzt:

class shape { 
public: 
    void setValues(int height_, int width_) { 
     height = height_, width = width_; 
    } 
protected: 
    int height, width; 

private: 

}; 

class rectangle :public shape, public ThreeDView{ 
public: 
    int area() { 
     return(shape::height*shape::width); 
    } 
    float threeDArea() { 
     return(((shape::height*shape::width)/2)*(std::cos(Z_LENGTH))); 
    } 
}; 

class triangle :public shape { 
public: 
    int area() { 
     return((shape::height * shape::width)/2); 
    } 
}; 

int main(){ 
rectangle rect2; 
triangle trng2; 

    rect2.setValues(2,3); 
    trng2.setValues(5,4); 
    std::cout << "AREA : " << trng1.area() << "AREA RECT : \n" <<rect1.area() << std::endl; 
} 

Bitte sagen Sie mir diffrence. Ehrlich gesagt, ich sehe nicht einmal die Verwendung von Polymorphismus! Danke fürs Helfen!

+1

Polymorphismus und Vererbung sind zwei orthogonale Konzepte, zwischen ihnen nur Unterschiede einfach keine Ähnlichkeit ist. –

+2

Auch Ihr Beispiel ist fehlerhaft. Das erste verwendet Polymorphismus überhaupt nicht. –

+1

Was ist 'ThreeDView'? Wenn das keine virtuelle Funktion hat, haben Sie keine * polymorphen * Typen. Das könnte Verwirrung stiften. – Bathsheba

Antwort

4

Hier ist eine Version Ihres ersten Beispiel, dass Polymorphismus tatsächlich verwendet:

#include <iostream> 
#include <string> 

class shape 
{ 
public: 
    void setValues(int height_, int width_) 
    { 
     height = height_; 
     width = width_; 
    } 

    virtual int area() = 0; // This is needed for polymorphism to work 

    virtual std::string name() = 0; 

protected: 
    int height; 
    int width; 
}; 

class rectangle : public shape 
{ 
public: 
    int area() 
    { 
     return height * width; 
    } 

    std::string name() 
    { 
     return "Rectangle"; 
    } 
}; 

class triangle :public shape 
{ 
public: 
    int area() 
    { 
     return height * width/2; 
    } 

    std::string name() 
    { 
     return "Triangle"; 
    } 
}; 

void print_area(shape& poly) 
{ 
    std::cout << poly.name() << ' ' << poly.area() << '\n'; 
} 

int main() 
{ 
    rectangle rect; 
    triangle trng; 

    rect.setValues(2, 3); 
    trng.setValues(5, 4); 

    print_area(rect); 
    print_area(trng); 
} 

Die erste große Veränderung ist, dass ich die virtual Funktion area in der shape Klasse deklarieren. Damit der Polymorphismus funktioniert, müssen die Funktionen in der Basisklasse als virtual deklariert werden. Die „Zuordnung“ zu 0 sagt einfach den Compiler, dass es eine abstrakte Funktion und die Kind-Klassen muss diese Funktion außer Kraft setzen.

Die zweite große Änderung ist, dass ich eine Funktion verwende, um den Bereich zu drucken, eine, die nur einen Verweis auf die Basisklasse shape nimmt. Sie müssen Verweise oder Zeiger auf die Basisklasse verwenden, damit Polymorphismus funktioniert. Verwenden Sie nicht die tatsächlichen Objekte direkt wie in Ihrem Beispiel.

This works as expected.