C ++:比较基类和派生类的指针

时间:2011-04-14 11:47:20

标签: 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?

2 个答案:

答案 0 :(得分:5)

在上述情况下,您不需要任何演员表,简单的Base* b = d;将起作用。然后你可以比较你现在比较的指针。

答案 1 :(得分:5)

如果你想比较任意类层次结构,安全的做法是使它们具有多态性并使用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);

考虑到有时你不能使用从派生到基类的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.
 */

如果虚拟地继承了A,则无法将static_cast静态地添加到D