C++中默认的(拷贝)构造函数 如何处理类对象中 指向vtable 这4个字节的空间的内容

本文通过C++示例代码探讨了基类指针指向派生类对象时的行为特性,特别是在调用虚函数及使用拷贝构造函数时的表现。通过对CBase类及其派生类CPart和CCom的操作,展示了不同情况下虚函数调用和对象拷贝的具体表现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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)表示这个短语指明的对象相同

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值