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

來源:互聯網
上載者:User

#include <iostream>
#include <vector>
#include <iterator>
using namespace std;

class CBase
{
public:
 virtual void fn()
 {
  ;
 }
 virtual void Add(CBase b)
 {
 }
 virtual void Add(CBase *pb)
 {
 }
 CBase( const CBase &b)
 {
  ::memcpy( (void*)this, (void *)&b,sizeof(CBase) );
 }
 CBase &operator=( const CBase &b)
 {
  ::memcpy( (void*)this, (void *)&b,sizeof(CBase) );
  return *this;
 }

 CBase()
 {
 }
};

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).fn();
 }
 void Add(CBase b)
 {
  m_vb.push_back( b);
 }
 virtual void Add(CBase *pb)
 {
  m_pvb.push_back( pb);
 }
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);
 pb->fn();
 return 0;

 

輸出:

p:fn

com:fn

p:fn

p:fn

p:fn

//使用工具:vc6

我們強制修改 對象的pvtbl(也就是指向vtable的指標)。所以即使是使用對象也可以實現多態性,、

但是別忘了平台有關性。

此外通常我們是不修改pvtbl的!!

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.