#include <cassert> 
#include <iostream> 
#include <memory> 
 
using  namespace  std; 
 
 
enum  class  ObjectCategory
	{ 
	none,
	XObject,
	YObject,
	XYObject
	} ; 
 
 
class  ObjectBase: 
	public  enable_shared_from_this<  ObjectBase > 
	{ 
	public : 
 
		ObjectBase( )  { } 
 
		virtual  ~ObjectBase( )  { } 
 
		virtual  ObjectCategory Category( )  const  =  0 ; 
 
	} ; 
 
class  XObject: 
	public  virtual  ObjectBase
	{ 
	public : 
 
		XObject( )  { } 
 
		~XObject( )  { } 
 
		ObjectCategory Category( )  const  override
			{ 
			return  ObjectCategory:: XObject ; 
			} 
 
	} ; 
 
int  main( ) 
	{ 
	typedef  shared_ptr<  ObjectBase >  ObjectPtr; 
 
	ObjectPtr p1 =  make_shared<  XObject > ( ) ; 
	assert (  ObjectCategory:: XObject  ==  p1- > Category( )  ) ; 
 
	auto  x1 =  static_pointer_cast<  XObject, ObjectBase > (  p1 ) ; 
	assert (  x1 ) ; 
 
	return  EXIT_SUCCESS ; 
	} 
 
 
				CiNpbmNsdWRlIDxjYXNzZXJ0PgojaW5jbHVkZSA8aW9zdHJlYW0+CiNpbmNsdWRlIDxtZW1vcnk+Cgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKCmVudW0gY2xhc3MgT2JqZWN0Q2F0ZWdvcnkKCXsKCW5vbmUsCglYT2JqZWN0LAoJWU9iamVjdCwKCVhZT2JqZWN0Cgl9OwoKCmNsYXNzIE9iamVjdEJhc2U6CglwdWJsaWMgZW5hYmxlX3NoYXJlZF9mcm9tX3RoaXM8IE9iamVjdEJhc2UgPgoJewoJcHVibGljOgoKCQlPYmplY3RCYXNlKCkge30KCgkJdmlydHVhbCB+T2JqZWN0QmFzZSgpIHt9CgoJCXZpcnR1YWwgT2JqZWN0Q2F0ZWdvcnkgQ2F0ZWdvcnkoKSBjb25zdCA9IDA7CgoJfTsKCmNsYXNzIFhPYmplY3Q6CglwdWJsaWMgdmlydHVhbCBPYmplY3RCYXNlCgl7CglwdWJsaWM6CgoJCVhPYmplY3QoKSB7fQoKCQl+WE9iamVjdCgpIHt9CgoJCU9iamVjdENhdGVnb3J5IENhdGVnb3J5KCkgY29uc3Qgb3ZlcnJpZGUKCQkJewoJCQlyZXR1cm4gT2JqZWN0Q2F0ZWdvcnk6OlhPYmplY3Q7CgkJCX0KCgl9OwoKaW50IG1haW4oKQoJewoJdHlwZWRlZiBzaGFyZWRfcHRyPCBPYmplY3RCYXNlID4gT2JqZWN0UHRyOwoKCU9iamVjdFB0ciBwMSA9IG1ha2Vfc2hhcmVkPCBYT2JqZWN0ID4oKTsKCWFzc2VydCggT2JqZWN0Q2F0ZWdvcnk6OlhPYmplY3QgPT0gcDEtPkNhdGVnb3J5KCkgKTsKCglhdXRvIHgxID0gc3RhdGljX3BvaW50ZXJfY2FzdDwgWE9iamVjdCwgT2JqZWN0QmFzZSA+KCBwMSApOwoJYXNzZXJ0KCB4MSApOwoKCXJldHVybiBFWElUX1NVQ0NFU1M7Cgl9Cg==
				
				 
				 
				 
				 
			 
			
				
			
			
				
	
		
	 
	
		  compilation info 
		 
	 
	In file included from /usr/include/c++/6/memory:82:0,
                 from prog.cpp:4:
/usr/include/c++/6/bits/shared_ptr.h: In instantiation of ‘std::shared_ptr<_Tp1> std::static_pointer_cast(const std::shared_ptr<_Tp2>&) [with _Tp = XObject; _Tp1 = ObjectBase]’:
prog.cpp:54:59:   required from here
/usr/include/c++/6/bits/shared_ptr.h:447:35: error: cannot convert from pointer to base class ‘ObjectBase’ to pointer to derived class ‘XObject’ because the base is virtual
     { return shared_ptr<_Tp>(__r, static_cast<_Tp*>(__r.get())); }
                                   ^~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
		
		 
	
		
		  stdout