簡體   English   中英

C ++從抽象基類指針復制數據?

[英]C++ copying data from an abstract base class pointer?

假設你有這個:

class foo {
public:
  virtual int myFunc() = 0;
  ///...
  virtual bool who()   = 0; // don't want to implement this
};

class bar : public foo {
public:
  int myFunc() {return 3;}
  //...
  bool who() {return true;} // don't want to implement this
};

class clam : public foo {
public:
  int myFunc() {return 4;}
  //...
  bool who() {return false;} // don't want to implement this
};


int main() {

  std::vector<foo*> vec (2, NULL);
  vec[0] = new bar();
  vec[1] = new clam();

  // copy vec and allocate new ptrs as copies of the data pointed to by vec[i]
  std::vector<foo*> vec2 (vec.size(), NULL);
  for ( int i=0; i<vec.size(); ++i ) {

    // obviously not valid expression, but it would be nice if it were this easy
    //vec2[i] = new foo(*vec[i]); 

    // the hard way of copying... is there easier way?
    if (vec[i]->who()) {
      vec2[i] = new bar ( * static_cast<bar* >(vec[i]) ) ;
    } else {
      vec2[i] = new clam( * static_cast<clam*>(vec[i]) );
    }

  }

  return 0;
}

我想要的是讓編譯器在其簿記中查找並根據存儲的* vec [i]類型分配/復制vec2 [i]的簡單方法。 解決方法是只創建一個虛函數,它基本上返回一個值,指定* vec [i]的類型,然后根據它進行條件分配。

一種常見的方法是這樣的:

class foo {
public:
  virtual foo* clone() = 0;
};

class bar : public foo {
public:
  virtual bar* clone() { return new bar(*this); }
};

class clam : public foo {
public:
  virtual clam* clone() { return new clam(*this); }
};

一種方法是使用動態強制轉換來確定對象的類型,例如在此處完成( 在C ++中查找對象的類型 )。 但最簡單的方法可能是使用typeid。

(假設你想保持使用類型作為判斷器的方式,否則我會推薦Joachim或Igor作為更好的選擇:))

你可以使用dynamic_cast進行向下轉換並測試類型,

bar* pbar = dynamic_cast<bar*>(vec[i])
if (pbar) {
  vec2[i] = new bar ( * static_cast<bar* >(vec[i]) ) ;
} else {
  vec2[i] = new clam( * static_cast<clam*>(vec[i]) );
}

有關詳細信息,請參閱dynamic_cast http://www.cplusplus.com/doc/tutorial/typecasting/

暫無
暫無

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

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