C++中預設的(拷貝)建構函式 如何處理類對象中 指向vtable 這4個位元組的空間的內容

來源:互聯網
上載者:User

class CBase
{
public:
 virtual void fn()
 {
  ;
 }
 virtual void Add(CBase b)
 {
 }
 virtual void Add(CBase pb)
 {
 }

}; 

class CPart :public CBase
{
public:
 void fn()
 {
  cout<<"p:fn"<<endl;
 }

};

class CCom:public CBase
{
public:
 void fn()
 {
  cout<< "com:fn"<<endl;
vector<CBase>::iterator itb,ite;
  itb = this->m_vb.begin();
  ite = this->m_vb.end();   //
  for( ; itb != ite ; ++itb)
   (*itb)->(*itb).fn();
 }
 void Add(CBase b)
 {
  m_vb.push_back( b);
 }

protected:
 vector<CBase> m_vb; //
};

int main(int argc, char* argv[])
{
 CPart p1,p2,p3,p4;
 CCom  c1,c2;
 CBase *pb = &p1;
 pb->fn();
 pb= &c1;
 pb->Add( p1);
 pb->Add( p2);
 pb->Add( p3);

}

輸出:

p:fn

com:fn

//在把對象加入向量時發生了拷貝建構函式的調用。

由於輸出的結果如是,可以斷定,A預設的拷貝建構函式 對 類對象中用於指向vtable指標的這塊空間(1) 的處理

方式是把 A的vtable指標賦給 這塊空間(1)。

而不是把p1的指向vtable指標的這塊空間得內容(其實是CPart的vtable的指標)賦給  這塊空間(1)

//(1)表示這個短語指明的對象相同

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.