Thomas Darimont
Erfahrenes Mitglied
Hallo!
Wie kann man den bei virtuellen Methoden den Mechanismus zum virtuellen Funktionsaufruf umgehen?
Beispiel:
Gruß Tom
Wie kann man den bei virtuellen Methoden den Mechanismus zum virtuellen Funktionsaufruf umgehen?
Beispiel:
Code:
#include <iostream>
#include <cmath>
using namespace std;
static double PI = acos(-1);
class Figur{
int xPos;
int yPos;
public:
Figur(int x, int y){
this->xPos = x;
this->yPos = y;
};
virtual ~Figur(){};
virtual double berechneFlaeche() = 0;
};
class Kreis : public Figur{
double radius;
public:
Kreis(int x, int y, double r):Figur(x,y),radius(r){};
~Kreis(){};
double berechneFlaeche(){return this->radius * this->radius * PI;};
};
class Rechteck : public Figur {
protected:
double seiteA;
double seiteB;
public:
Rechteck(int x, int y, double a, double b): Figur(x,y), seiteA(a), seiteB(b){};
virtual ~Rechteck(){};
virtual double berechneFlaeche(){ return this->seiteA * this->seiteB;};
};
class Quadrat : public Rechteck {
public:
Quadrat(int x, int y, double a) : Rechteck(x,y,a,a){};
~Quadrat(){};
virtual double berechneFlaeche(){ return this->seiteA * this->seiteA;};
};
int main(int argc, char *argv[]){
//Hier wird ja jeweils ein Lookup in die VTabele (Virtuelle Funktionen Tabelle) gemacht
//und die passende Methode zur jeweiligen instanz besorgt...
Figur* f = new Kreis(10,100,152);
cout << f->berechneFlaeche() << endl;
//...
Figur* f1 = new Rechteck(1,2,100.0,231.0);
cout << f1->berechneFlaeche() << endl;
//...
Figur* f2 = new Quadrat(100,100,256.0);
cout << f2->berechneFlaeche() << endl;
//Ich habe nun im Buch "Die C++ Programmiersprache von Bjarne Stroustrup im Kapitel
//Abgeleitete Klassen davon gelesen, dass man den VTable Lookup umgehen kann indem man mittels
//des "Scope Resultions Operators" :: der Methode berechneFlaeche() schon den richtigen "scope"
//mitgibt.
//Wie mache ich das OHNE f3 als Quadrat oder Quadrat definieren zu müssen?
Figur* f3 = new Quadrat(12,123,1233.0);
//cout << Quadrat::f3::berechneFlaeche() <<endl; <- das Funktioniert nicht...
delete f;
delete f1;
delete f2;
return 0;
}
Gruß Tom