Warum funktioniert folgender C++ Code?
Verfasst: 11.02.2013, 13:06
Hallo zusammen
Wann immer ich als Hobbyprogrammierer ein wenig Zeit finde, stöbere ich durch die interessante Welt von C++ und lerne ständig neue interessante Konstrukte.
Nun bin ich auf folgendes Konstrukt gestossen, welches virtuelle Methoden simuliert. Nur, warum funktioniert das? Zuerst einmal der Code:
Test::CallMethods() ruft die bestehende Demo::FirstMethod() Methode auf, und danach die eigene Test::SecondMethod(). Doch warum klappt das?
Es wird ja nirgendwo ein Demo-Objekt erzeugt oder irre ich mich da? Es muss dazu gesagt werden, dass ich sehr wenig Erfahrung mit Templates habe.
Liebe Grüsse
Wann immer ich als Hobbyprogrammierer ein wenig Zeit finde, stöbere ich durch die interessante Welt von C++ und lerne ständig neue interessante Konstrukte.
Nun bin ich auf folgendes Konstrukt gestossen, welches virtuelle Methoden simuliert. Nur, warum funktioniert das? Zuerst einmal der Code:
Code: Alles auswählen
#include <iostream>
#include <ostream>
namespace ConsoleApplication
{
template <typename Derived>
class Test
{
public:
Test() : derived(static_cast<Derived *>(this)) {}
void CallMethods()
{
derived->FirstMethod();
derived->SecondMethod();
}
void FirstMethod() const
{
::std::cout << "Test::FirstMethod()" << ::std::endl;
}
void SecondMethod() const
{
::std::cout << "Test::SecondMethod()" << ::std::endl;
}
private:
Derived * derived;
};
class Demo : public Test<Demo>
{
public:
Demo() {}
void FirstMethod() const
{
::std::cout << "Demo::FirstMethod()" << ::std::endl;
}
/*
void SecondMethod() const
{
::std::cout << "Demo::SecondMethod()" << ::std::endl;
}
*/
};
}
int main()
{
using namespace ::ConsoleApplication;
Test<Demo> test;
test.CallMethods();
return 0;
}
Es wird ja nirgendwo ein Demo-Objekt erzeugt oder irre ich mich da? Es muss dazu gesagt werden, dass ich sehr wenig Erfahrung mit Templates habe.
Liebe Grüsse