#include <iostream>
class A {
public: virtual void blah() { std::cout << "in a" << std::endl; }
void dupa() { std::cout << "dupA" << std::endl; }
};
class B : public A {
public: void blah() { std::cout << "in b" << std::endl; }
void dupa() { std::cout << "dupB" << std::endl; }
};
class C : public B {
public: void blah() { std::cout << "in c" << std::endl; }
void dupa() { std::cout << "dupC" << std::endl; }
};
int main()
{
A *a = new A;
B *b = new B;
C *c = new C;
std::cout << "normal calls: " << std::endl;
a->blah();
a->dupa();
b->blah();
b->dupa();
c->blah();
c->dupa();
std::cout << "b casted to a: " << std::endl;
a = static_cast<A*>(b);
a->blah();
a->dupa();
std::cout << "c casted to a: " << std::endl;
a = static_cast<A*>(c);
a->blah();
a->dupa();
std::cout << "c casted to b: " << std::endl;
b = static_cast<B*>(c);
b->blah();
b->dupa();
return 0;
}