Pau*_*nta 10 c++ inheritance pointers dynamic-cast
在比较像这样的情况下的指针时,我想了解一些关于最佳实践的信息:
class Base {
};
class Derived
: public Base {
};
Derived* d = new Derived;
Base* b = dynamic_cast<Base*>(d);
// When comparing the two pointers should I cast them
// to the same type or does it not even matter?
bool theSame = b == d;
// Or, bool theSame = dynamic_cast<Derived*>(b) == d?
Run Code Online (Sandbox Code Playgroud)
如果你想比较任意类层次结构,安全的做法是使它们具有多态性并使用 dynamic_cast
class Base {
virtual ~Base() { }
};
class Derived
: public Base {
};
Derived* d = new Derived;
Base* b = dynamic_cast<Base*>(d);
// When comparing the two pointers should I cast them
// to the same type or does it not even matter?
bool theSame = dynamic_cast<void*>(b) == dynamic_cast<void*>(d);
Run Code Online (Sandbox Code Playgroud)
考虑到有时您不能使用从派生到基类的static_cast或隐式转换:
struct A { };
struct B : A { };
struct C : A { };
struct D : B, C { };
A * a = ...;
D * d = ...;
/* static casting A to D would fail, because there are multiple A's for one D */
/* dynamic_cast<void*>(a) magically converts your a to the D pointer, no matter
* what of the two A it points to.
*/
Run Code Online (Sandbox Code Playgroud)
如果A是虚拟继承,则不能static_cast到D.