#include<iostream>
class I{
	public:
		virtual void  f()=0;
};

enum TYPE{
	TYPE_I,
};

class Base{
	public:
		Base(){
			std::cout << "Base::Base()\n"; 
		}
		
		virtual ~Base(){
			std::cout << "Base::~Base()\n"; 
		}
		virtual TYPE getType()=0;
		int i;
};

class A : public Base, public I {
	public:
		A(){
			std::cout << "A::A()\n"; 
		}
		virtual ~A(){
			std::cout << "A::~A()\n"; 
		}
		virtual TYPE getType(){
			 std::cout << "A::getType()\n"; 
			return TYPE_I;
		}
		virtual void  f(){ std::cout << "A::f()\n"; }
		
		
};

int main(){
	A *a=new A;
	void *vp=a;
	if(static_cast<Base*>(vp)->getType()==TYPE_I){
			std::cout << "call I::f()\n"; 
			
			static_cast<I*>(vp)->f();
	}
	std::cout << "delete a\n"; 
	delete a;
}