簡體   English   中英

使用現有的基類對象創建派生類對象?

[英]creating a derived class object with existing base class object?

是否有可能(或快速解決方法)創建定義為派生類的對象而不在內存中創建基類對象; 相反,派生對象應該引用基類的實際存在對象(“接管”它的內存駐留)? 出於速度原因需要這樣做 - 創建新的派生對象,將數據從基類對象復制到它,然后銷毀基礎對象需要花費太多時間。

在這種情況下,您可能想要考慮組合而不是繼承 - 這會更自然。

我不會使用該語言支持的class構造。 如果你需要一些小而且靈活的考慮編寫一個struct並使用函數指針實現你自己的v-table 與此相同的方式就像在Linux內核中完成的那樣。 請注意,面向對象編程幾乎可以用任何語言完成,不一定是支持它的語言。

然后,您可以動態切換v表指針,並可能執行一些realloc ,以便添加派生類型所需的字段。

最后,您可以將所有這些打包在一個沒有任何動態方法的常規class ,並將所有調用委托給所描述的內部結構。 這不應該強加任何內存或計算開銷。

編輯:其實我覺得realloc不是要走的路。 這是一個涉及底層操作系統並需要上下文切換的例程。 如果已經分配了適當的內存塊,幾乎總是調用copy會更快。 如果您對速度感興趣,那么可以考慮實現自己的內存管理或使用庫提供的替代實現之一,如boost。

如果您希望創建一個基類的版本並讓所有對象繼承或從同一實例派生,那么您可以在基類中將事物聲明為靜態。 靜態表示每個類實例的一個版本。

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都在查看FooBase::IDCntFooBase::ObjCnt的相同內存塊。

您是否考慮過工廠設計模式?

您的基類只需要知道您想要創建的派生類

我認為你不能做你想做的事。

考慮:

   d1 = prestochango(b);
   d2 = prestochango(b);
   d1.blarf = waldo;
   // what value does d2.blarf now have?

d1和d2是不同的對象,包括不同的b-底物,或者它們是相同的物體。

現在,您可以通過使您的b基板成為您的d級靜態成員來偽裝它。

如果你想要動態調用派生類,那么v-table是必不可少的。

所以也許你可以實現沒有數據成員的“基類”,並在調用期間傳入虛函數需要作為參數的數據或指針。

它會節省內存,但需要更多時間。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM