+/**
+ * Base class for all reference counted SimGear objects with virtual base
+ * classes, supporting weak references.
+ *
+ * Classes derived from this one are meant to be managed with the SGSharedPtr
+ * and SGWeakPtr classes.
+ *
+ * @code{cpp}
+ *
+ * class Base1:
+ * public virtual SGVirtualWeakReferenced
+ * {};
+ *
+ * class Base2:
+ * public virtual SGVirtualWeakReferenced
+ * {};
+ *
+ * class Derived:
+ * public Base1,
+ * public Base2
+ * {};
+ *
+ * SGSharedPtr<Derived> ptr( new Derived() );
+ * SGWeakPtr<Derived> weak_ptr( ptr );
+ * SGSharedPtr<Base1> ptr1( weak_ptr.lock() );
+ * SGSharedPtr<Base2> ptr2( weak_ptr.lock() );
+ *
+ * @endcode
+ */
+class SGVirtualWeakReferenced:
+ public SGWeakReferenced
+{
+ public:
+ virtual ~SGVirtualWeakReferenced() {}
+};
+
+/// Upcast in a class hierarchy with a virtual base class
+// We (clang) need the definition of SGVirtualWeakReferenced for the static_cast
+template<class T>
+typename boost::enable_if<
+ boost::is_base_of<SGVirtualWeakReferenced, T>,
+ T*
+>::type
+SGWeakReferenced::WeakData::up_cast(SGWeakReferenced* ptr)
+{
+ // First get the virtual base class, which then can be used to further
+ // upcast.
+ return dynamic_cast<T*>(static_cast<SGVirtualWeakReferenced*>(ptr));
+}
+