是否有可能(或快速解决方法)创建一个定义为派生类的对象而不在内存中创建基类对象;相反,派生对象应该引用基类的实际存在对象(“接管”它的内存驻留)?出于速度原因需要这样做 - 创建新的派生对象,将数据从基类对象复制到它,然后销毁基础对象需要花费太多时间。
答案 0 :(得分:2)
在这种情况下,你可能想要考虑组合而不是继承 - 这会更自然。
答案 1 :(得分:1)
我不会使用该语言支持的class
构造。如果你需要一些小而灵活的东西,可以考虑使用函数指针编写struct
并实现自己的v-table
。与此相同的方式就像在Linux内核中完成的那样。请注意,面向对象的编程几乎可以用任何语言完成,不一定是支持它的语言。
然后,您可以动态切换v表指针,并可能执行一些realloc
,以便添加派生类型所需的字段。
最后,您可以将所有这些打包在一个没有任何动态方法的常规class
中,并将所有调用委托给所描述的内部结构。这不应该强加任何内存或计算开销。
编辑:其实我猜realloc
不是要走的路。这是一个涉及底层操作系统并需要上下文切换的例程。如果已经分配了适当的内存块,几乎总是调用copy
会更快。如果您对速度感兴趣,那么可以考虑实现自己的内存管理或使用库提供的替代实现之一,如boost。
答案 2 :(得分:0)
我认为你不能做你想做的事。
考虑:
d1 = prestochango(b);
d2 = prestochango(b);
d1.blarf = waldo;
// what value does d2.blarf now have?
d1和d2是不同的对象,包括不同的b-底物,或者它们是同一个物体。
现在,你可以通过让你的b-substrate成为你级别的静态成员来伪造它。
答案 3 :(得分:0)
如果你想要动态调用派生类,那么v-table是必不可少的。
所以也许你可以实现没有数据成员的“基类”,并在调用期间传入虚函数需要作为参数的数据或指针。
它会节省内存,但会耗费更多时间。
答案 4 :(得分:0)
如果您希望创建一个基类的版本并让所有对象继承或从同一实例派生,那么您可以在基类中将事物声明为静态。静态意味着每个类的实例都有一个版本。
即
class FooBase {
protected:
static int IDCnt;
static int ObjCnt;
int ID;
public:
FooBase();
~FooBase();
virtual int GetID();
virtual int GetObjCnt();
virtual int GetIDCnt();
};
//implementation
int FooBase::IDCnt = 0; //need to init static vars
int FooBase::ObjCnt = 0;
FooBase::FooBase() { ID = IDCnt; IDCnt++; ObjCnt++; }
FooBase::~FooBase() { ObjCnt--; }
int FooBase::GetID() { return ID; }
int FooBase::GetObjCnt() { return ObjCnt; }
int FooBase::GetIDCnt() { return IDCnt; }
#include "FooBase.h"
class FooDerived : public FooBase {
//blah
};
#include "FooDervied.h"
int main() {
FooDerived A;
FooDerived B;
cout << A.GetID() << ' ' << A.GetObjCnt() << ' ' << A.GetIDCnt() << endl;
cout << B.GetID() << ' ' << B.GetObjCnt() << ' ' << B.GetIDCnt() << endl;
if(true) {
FooDerived C;
cout << A.GetObjCnt() << ' ' << A.GetIDCnt() << ' ' << B.GetObjCnt << C.GetIDCnt() << endl;
}
cout << B.GetObjCnt() << '' << A.GetObjCnt() << ' ' << A.GetIDCnt() << ' ' << B.GetIDCnt << endl;
}
通过这种方式,您不会声明基类项,而是通过静态变量继承基类的实例,这基本上意味着所有FooDerived
都在查看{{1}的同一内存块}和FooBase::IDCnt
。
答案 5 :(得分:0)
您是否考虑过工厂设计模式?
您的基类只需知道您想要创建的派生类