以这些不同的方式声明继承类的实例是否有区别?

Jar*_*red 2 c++

如果我有一个名为"Animal"的类,以及派生类"Bird:public Animal",我可以通过以下两种方式创建Bird:

Animal *sparrow = new Bird;
Bird *sparrow = new Bird;
Run Code Online (Sandbox Code Playgroud)

编译正常并按预期工作.它们是等价的吗?我应该更喜欢一个吗?

Meh*_*ari 5

这条线本身并没有表现出差异.但是,假设Bird声明了一个Fly不存在的方法Animal.你将无法做到:

Animal* a = new Bird;
a->Fly();
Run Code Online (Sandbox Code Playgroud)

另一方面,这是合法的:

Bird* b = new Bird;
b->Fly();
Run Code Online (Sandbox Code Playgroud)

这里的区别是C++是一种静态类型语言的结果.变量的静态类型是编译器在验证方法调用之类时所关心的.由于静态类型的变量aAnimal它没有一个Fly方法,编译器不会让你调用Fly就可以了(并非所有的动物都能够飞,所以你必须明确地转换为Bird:dynamic_cast<Bird*>(a)->Fly()是合法的).

表达式new Bird将具有类型Bird*.如果将派生类型的值赋给基于类型的变量,编译器将不会抱怨(所有Birds都是Animals,所以它应该始终有效).基本上,编译器upcasts Bird*Animal*.反之则不然.并非所有Animals都是Birds,所以你必须承担责任并明确地执行转换并告诉编译器我知道该对象确实是一个Bird*.只有在这种情况下,编译器才会允许您使用Bird特定功能.所以,一般来说,如果你需要使用一个Bird特定的成员,你最好使用Bird* b = new Bird;.