如果基类有一个成员A,子类1需要使用这个A,子类2不需要使用这个A,那么这个A应该定义成对象还是指针?
1.首先设计上应该是有问题的,既然子类2继承基类了,A自然就会成为子类2的成员,但是你认为不需要A了,所以设计上是有问题的,A应该作为子类1的成员,而不是基类的成员。
2. 当然在现有的设计上,A定义为指针会更好一些,指针相对于普通对象更节省空间(可能你的A对象sizeof是34字节,但A指针的sizeof只占用8字节),另外也是认为在使用A的时候需要A了则new创建,不需要则是默认的空指针,减少无效的内存分配。
我理解都可以,
如果说子类1 使用A,子类2 不使用 A,那其实这个 成员A就不适合在 基类中, 基类可以理解为 更高的抽象,子类应该包含基类所有的特性(变量和方法)
1.首先设计上应该是有问题的,既然子类2继承基类了,A自然就会成为子类2的成员,但是你认为不需要A了,所以设计上是有问题的,A应该作为子类1的成员,而不是基类的成员。
2. 当然在现有的设计上,A定义为指针会更好一些,指针相对于普通对象更节省空间(可能你的A对象sizeof是34字节,但A指针的sizeof只占用8字节),另外也是认为在使用A的时候需要A了则new创建,不需要则是默认的空指针,减少无效的内存分配。
该回答引用ChatGPT4与博主@晓码自在合作编写:
这种情况下,A 适合定义为指针。理由如下:
所以,总体来说,当某个成员仅部分子类需要使用时,定义为指针是更好的选择。它可以灵活地根据需要使用或不使用该成员,还可以利用多态等 OOP 特性。
举个简单例子:
cpp
class Base {
public:
A* a; // 定义为指针
};
class Derived1 : public Base {
public:
Derived1() {
a = new A(); // 创建对象,并使指针指向该对象
}
};
class Derived2 : public Base {
public:
Derived2() {
// a 保持为 nullptr,不进行任何操作
}
};
这里基类 Base 定义了一个指针 a,子类 Derived1 在构造函数中为其分配了对象,子类 Derived2 不进行任何操作,则 a 仍为 nullptr。这样就实现了仅部分子类使用该成员的目的。
如果将 a 定义为对象,那么 Derived2 的构造函数也需要调用 a 的构造函数,即使它不需要使用该对象,也会造成资源浪费。