#include <iostream>
#include <list>
using namespace std;

class T1 {
public: 
    virtual void f() {
    	cout<<"I'm f() from T1"<<endl; 
    }
};
class T2 {
public: 
    virtual void f() {
    	cout<<"I'm f() from T2"<<endl; 
    }
   virtual void g() {
    	cout<<"I'm g() from T2"<<endl; 
    }
};
class T3 : public T1, public T2 {
public: 
    void f() {
    	T2::f();
    	T1::f();
    }
};

int main() {
	// your code goes here
	list<T2*> l{ new T2(), new T3() };
	for (auto &x : l) {
		x->f(); 
		x->g();
	}
	cout <<"--"<<endl; 
	T1* last_one = dynamic_cast<T1*>(l.back());  // last is also T1 
	last_one->f();  
	
	return 0;
}