#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