如果我有一个名为“Animal”的类,以及派生类“Bird:public Animal”,我可以通过以下两种方式创建一个Bird:
Animal *sparrow = new Bird;
Bird *sparrow = new Bird;
编译正常并按预期工作。它们是等价的吗?我应该更喜欢一个吗?
答案 0 :(得分:5)
这条线本身并没有表现出差异。但是,假设Bird
声明Fly
上不存在的方法Animal
。你将无法做到:
Animal* a = new Bird;
a->Fly();
另一方面,这是合法的:
Bird* b = new Bird;
b->Fly();
这里的区别是C ++是一种静态类型语言的结果。变量的静态类型是编译器在验证方法调用之类时所关心的。由于变量a
的静态类型是Animal
而没有Fly
方法,编译器将不允许您在其上调用Fly
(并非所有动物)能够飞行,所以你必须明确地转向Bird
:dynamic_cast<Bird*>(a)->Fly()
是合法的)。
表达式new Bird
的类型为Bird*
。如果将派生类型的值分配给基于类型的变量,编译器将不会抱怨(所有Bird
都是Animal
s,因此它应该始终有效)。基本上,编译器会将Bird*
向上转换为Animal*
。反之则不然。并非所有Animal
都是Bird
s,因此您必须承担责任并明确执行转换并告诉编译器我知道该对象实际上是Bird*
。只有在这种情况下,编译器才允许您使用Bird
特定功能。因此,一般情况下,如果您需要使用Bird
特定成员,最好使用Bird* b = new Bird;
。