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