我需要有关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();