之间有什么区别:
cBase* object = new cDerived();
和
cDerived* object = new cDerived();
如果是这样,在哪种情况下我选择一个而不是另一个?
答案 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
的成员。