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

本文通过一个具体的C++代码示例介绍了如何实现并使用多态性,包括基类和派生类的方法覆盖,以及通过基类指针调用派生类方法的过程。特别展示了如何在运行时决定调用哪个类的具体实现。

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

#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的!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值