C++问题,使用指针还是对象

如果基类有一个成员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 适合定义为指针。理由如下:

  1. 如果 A 定义为对象,那么即使子类 2 不需要使用它,它仍然会占用内存空间,造成一定的空间浪费。
  2. 如果将来子类 2 需要使用 A,那么可以简单的为其指针赋值,获取对象的控制权。如果定义为对象,则无法做到这一点,需要修改子类 2 的定义。
  3. C++ 支持多态,如果 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 的构造函数,即使它不需要使用该对象,也会造成资源浪费。