我需要有关C++中特定编程问题的帮助(不确定是否可以在C++中实现)。我需要能够访问基类中的所有公共(public)成员函数,但不想在分配派生类对象时为基类数据分配内存。

可以说,我有:

class Base
{
  public:
    Base();
    ~Base();
    int GetFoo() { return foo; }
    // other public member functions of Base class

  private:
    int foo;
    // other data
};

class Derived : public Base
{
  public:
    Derived(Base *BasePtr);
    Derived(Base &BaseRef);
    ~Derived();
    double GetXyz() { return xyz; }
    // other public member functions of Derived class

  private:
    double xyz;
    // other data
};

现在,可以说我已经分配并初始化了一个基类。我想通过引用现有的基础对象来创建新的Derived类对象,并仅为特定于Derived类的数据分配内存。在上面的示例之后,我已经在基类对象中为“int foo”分配了内存,并且只想在派生类对象中为“double xyz”分配了内存。
Base *basePtr = new Base();
Derived *derivedPtr = new Derived(basePtr); // what is the content of this function?

派生类的内存分配或构造函数应该是什么样?我想继承Base类的所有数据和成员函数,但不对Base和Derived进行“组合”数据分配。我试过重载新的运算符,但没有运气。任何帮助表示赞赏。

最佳答案

我不确定它是否符合您的要求,但是您可以简单地将存储在Base中的basePtr的内容复制到新的Derived对象中,然后删除Base对象并使用旧的Derived指针指向新的Base对象。像这样:

Base *basePtr = new Base();
/* Do something with base here */
Derived *derivedPtr = new Derived(basePtr);
delete basePtr;
basePtr = derivedPtr;
derivedPtr = 0;

这样,您最终将只剩下一个对象(Derived类型),而不必存储指向该对象的单独指针,也不必存储Base对象,这似乎就是您所需要的。

更新:



在这种情况下,也许您应该尝试做一个“可扩展的结构化包装器”。首先创建一个没有任何方法或成员的简单类:
class Additional{};

然后创建一个包装器结构:
struct wrapper{
    Base *basePtr;
    Additional *moreInfo;
}

然后,不要从Derived派生Base类,而要从Additional派生它。而不是存储数百万个Base指针,而是存储数百万个wrapper指针。 IT将使您的代码更长一点,更难以理解,但是它将满足您的需求。好吧-除非Derived类添加的唯一内容是指针或任何占用较小大小的数据。

如果您在virtual中具有Base函数,则要在新的层次结构中使用它们,oyu将仅需每次检查:
wrapper *wrapperPtr = &alreadyCreatedSomewhereWrapper;
if(wrapperPtr->moreInfo)
    wrapperPtr->moreInfo->function();
else
    wrapperPtr->basePtr->function();

10-02 01:09
查看更多