Polymorphismus
Dieser Teil von ManderC ist noch in Bearbeitung
20.000000
9.000000
|
#include <cstdio>
class Shape{
public:
virtual float computeArea() = 0;
virtual ~Shape(){}
};
class Rectangle : public Shape {
float width, height;
public:
Rectangle(float w, float h){width = w; height = h;}
float computeArea() {return width * height;}
};
class Square : public Shape {
float side;
public:
Square(float s){side = s;}
float computeArea() {return side * side;}
};
int main(){
Shape* x;
x = new Rectangle(4.f, 5.f);
printf("%f\n", x->computeArea()); delete x;
x = new Square(3.f);
printf("%f\n", x->computeArea()); delete x;
return 0;
}
|
Damit das Runtime-System die korrekte Methode aufrufen kann, speichert jedes Objekt einer Klasse mit virtuellen Methoden eine sogenannte vtable
, die virtuals table
.
Ist eine Methode nicht virtualisiert, weiss der Compiler stets aufgrund des statischen Typs, welche Methode aufzurufen ist. Somit benötigt eine Objekt KEINE vtable, wenn deren Klasse keinerlei virtuelle Methoden besitzt (inklusive aller Eltern-Klassen). Folgendes Beispiel verdeutlicht dies:
4
4
8
8
|
#include <cstdio>
class TestClass1{
float x;
public:
void dosomething() {printf("1\n");}
};
class TestClass2 : public TestClass1 {
public:
void dosomething() {printf("2\n");}
};
class TestClass3{
float x;
public:
virtual void dosomething() {printf("3\n");}
virtual ~TestClass3(){}
};
class TestClass4 : public TestClass3 {
public:
void dosomething() {printf("4\n");}
};
int main(){
printf("%d\n", (int)sizeof(TestClass1));
printf("%d\n", (int)sizeof(TestClass2));
printf("%d\n", (int)sizeof(TestClass3));
printf("%d\n", (int)sizeof(TestClass4));
}
|
In diesem Beispiel ist zu beachten, dass die Klasse 2 zwar von der Klasse 1 erbt, die Methode jedoch von der Elternklasse nicht virtualisiert wurde. Dementsprechend wird vom Compiler stets der statische Typ angenommen und folgender Aufruf ergibt zweimal dieselbe Ausgabe:
1
1
|
TestClass1* c;
c = new TestClass1(); c->dosomething(); delete c;
c = new TestClass2(); c->dosomething(); delete c;
|