将对象转换为基类或派生类?

时间:2016-07-06 03:44:55

标签: c++ polymorphism

之间有什么区别:

cBase* object = new cDerived();

cDerived* object = new cDerived();

如果是这样,在哪种情况下我选择一个而不是另一个?

2 个答案:

答案 0 :(得分:4)

不同之处在于他们将object声明为具有不同类型,这可能会产生很多后果。例如:

  • 如果cDerived声明了任何新成员(超出了cBase继承的成员数),那么只有cDerived* object版本才能使这些成员可用(除非您明确地向下转发回cDerived* })。
  • 如果cBase声明cDerived覆盖的任何非虚拟成员函数,则调用哪一个函数取决于您用来调用它的指针的类型。
  • 如果某个函数需要cDerived*,那么您无法将cBase*传递给它(除非您明确地向下传播回cDerived*)。

答案 1 :(得分:2)

您的两个示例中,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的成员。