将对象强制转换为基类或派生类

Cast object to base or derived class?

本文关键字:基类 派生 转换 对象      更新时间:2023-10-16

cBase* object = new cDerived();

cDerived* object = new cDerived();

如果是,在哪些情况下我应该选择其中一个而不是另一个?

区别在于它们将object声明为具有不同的类型,这可能会产生许多后果。例如:

  • 如果cDerived声明了任何新成员(超出了它从cBase继承的成员),那么只有cDerived* object的版本才可以使用这些成员(除非您显式向下转换回cDerived*)。
  • 如果cBase声明了cDerived覆盖的非虚成员函数,那么调用哪一个取决于调用它的指针的类型。
  • 如果一个函数期望接受一个cDerived*,那么你不能传递给它一个cBase*(除非你显式向下转换回cDerived*)。

object的静态类型在您的两个示例中是不同的。让我们举个例子:

struct A {};
struct B : A
{
    void method() {}
};
int main() {
    A* a = new B;
    B* b = new B;
    a->method(); // compile error, A has no member named method.
    b->method(); // fine. b's static type is B*, and B has a member named method
}

a实际上指向B对象并不重要;它的静态类型是A*, A没有名为method的成员。