声明基类类型的指针,但随后通过指向子类来实例化它.这是良好的编程实践吗?
Declare a pointer of type base class, but then instantiate it by pointing to a child class. Is this good programming practice?
我正在尝试围绕多态性和指针来思考,并正在关注一些精彩的视频来解释它(如果您真的关心,请超链接)
他宣称class A
和class B
继承自A。
但是为了实例化 B 的对象,他这样做是这样的:
A* b = new B;
它工作正常(他在创建更复杂的类时继续使用该方法,一个包含子类 Square、Circle 等的基本类型 Shape 的矢量数组,即
std::vector<Shape*> shapes;
shapes.push_back(new Circle.........
shapes.push_back(new Rectangle.......
这是可能的,但是声明指向基类对象的指针,然后通过指向其子类来实例化它是否完全可以(甚至推荐)?
我想我刚刚回答了我自己的问题,好处来自于能够通过父类引用它们来管理不同对象的集合?这是对的吗?
谢谢!
指向基类对象的指针,然后通过指向其子类来实例化它是否完全可以(甚至推荐)?
当您使用
A* ptr = new B();
而不是
B* ptr = new B();
您只丢失了少量信息。不能使用在B
中定义但不能在A
中定义的任何成员函数。 请注意,使用virtual
A
声明但在B
中实现的成员函数是完全可以的。
如果在您的用例中可以承受少量损失,那么使用A* ptr =
就没有害处了。如果您希望能够保留指针的B
性,以便可以使用它来访问特定于B
的成员,则必须使用B* ptr =
。
有一个关于使用指针/引用类型的指导原则:
定义函数接口时,请使用在类层次结构中尽可能高的指针/引用类型来实现函数。
鉴于
struct Shape { ... }; struct Circle : Shape { ... };
不要在函数的接口中使用
Circle
,如果你在函数中需要的所有内容都可以从Shape
获得。当你添加
Shape
的下一个子类时,struct Rectangle : Shape { ... };
该函数也可以与
Rectangle
一起使用,而无需进行任何更改。定义指针/引用时,请使用保留尽可能多的信息的类型。
如果有函数
Circle* someFunction();
然后,使用
Circle* circlePtr = someFunction();
而不是
Shape* shapePtr = someFunction();
您可以在任何需要
Shape*
的地方使用circlePtr
,但您将无法在需要Circle*
的任何地方使用shapePtr
。
您部分回答了您的问题,但也可能有其他原因。
多态性是这样你就可以保持一些抽象的东西。例如,想象一下这样的代码:
Person *actor;
if (occupation == 'nerd') {
actor = new NerdPerson();
}
else if (occupation == 'mortician') {
actor = new MorticianPerson();
}
...
actor->printOccupation();
显然,这是一个编造的理由。所以它可能是关于某些东西的集合,但这只是一个原因。
- 从C++实例化QML
- 设计一个只能由特定类实例化的类(如果可能的话,通过make_unique)
- 如何创建一个空的全局类并在启动时实例化它
- 在两个类中共享相同的函数调用,并在不需要时避免空实例化
- 约束和显式模板实例化
- 为什么包含windows.h会产生语法错误,从而阻止类的实例化?(C2146,C2065)
- 对象实例化调用构造函数的次数太多
- 如何使用非默认构造函数实例化模板化类
- 静态数据成员模板专用化的实例化点在哪里
- 错误的cv::face FacemarkLBF实例化
- C++的解析器在可以区分比较和模板实例化之前会做什么?
- 为什么 gcc 和 clang 为函数模板的实例化生成不同的符号名称?
- 检查某些类型是否是模板类 std::optional 的实例化
- 我有一个对象,它将在整个程序的持续时间内实例化,但一个类成员不会,我应该动态分配它吗?
- 无法使用 SWIG 在 Python 中实例化C++类(获取属性错误)
- 模板化类构造函数的模板实例化
- 在 c++ 中的模板实例化中使用带有构造函数的类作为类型参数
- 受约束的成员函数和显式模板实例化
- 对显式实例化的模板函数的未定义引用
- 声明基类类型的指针,但随后通过指向子类来实例化它.这是良好的编程实践吗?