C++语法基础--派生类的构造函数,赋值操作符,析构函数,虚析构函数

本文探讨了C++中派生类的构造函数、赋值操作符和析构函数的使用,特别是强调了在基类中声明虚析构函数的重要性,以确保正确地调用派生类的析构函数。
摘要由CSDN通过智能技术生成
1.如果派生类定义了自己的构造函数(复制构造函数)或赋值操作符,该构造函数(复制构造函数)或赋值操作符一般应显式使用基类构造函数(复制构造函数)或赋值操作符初始化基类部分、
  Eample:
     class base
  {
   public:
    base()
    {
    }
   
    base(int i):x(i)
    {
    cout<<"base::constructor"<<endl;
    }
   
  base(base& other)
  {
  cout<<"base::copy"<<endl;
  x=other.x;
  }
 
  base& operator=(base &other)
  {
  cout<<"base::assign"<<endl;
  x=other.x;
  }
  
 
  int x;
  };
  
  class derived:public base
  {
  public:
  derived()
  {
  }
  derived(int i,int j):base(i),y(j)
  {
  cout<<"derived::constructor"<<endl;
  }
 
  derived(derived& other):base(other)
  {
  cout<<"derived::copy"<<endl;
  y=other.y;
  }
 
  derived& operator=(derived& other)
     {
         base::operator=(other);
         cout<<"derived::assign"<<endl;
      y=other.y;
     }
     
   void fun()
{
cout<<"derived:\n"<<x<<ends<<y<<endl;
}

  private:
  int y;
             
  };
  
 int main()
 {
     
derived d(1,2);//constructor
     d.fun();
    
    cout<<endl;
    
    derived d1(d);//copy-constructor
    d1.fun();
    
    cout<<endl;
    
    derived d2;
    d2=d1;   //assign
    d2.fun();
   
    return 0;
 }



运行结果:
 







 

2.析构函数
     *编译器总是显式调用派生类对象基类部分的析构函数,每个析构函数只负责清除自己的成员
     *首先运行派生类析构函数,然后按继承层次依次向上调用各基类析构函数
    
 Example:
    class base
  {
   public:
    ~base()
    {
    cout<<"base::~base()"<<endl;
    }
   
  };
  
  class derived:public base
  {
  public:
  ~derived()
  {
  cout<<"derived::~derived()"<<endl;
  }
 
   };
  
 int main()
 {
    
    base *pb=new derived;
    delete pb;
  cout<<endl;
   
  derived d;
return 0;
 }



Output:
 base::~base()
 
 derived::~derived()
 base::~base()


3.虚析构函数

 *析构函数为虚函数,通过指针调用时,运行的析构函数将因指针所指对象类型的不同而不同

 从上面结果可以看出,当delete pb时,只调用了基类的析构函数,派生类定义的析构函数并没有被调用,解决办法,把基类的析构函数声明为虚析构函数

 
Example:
class base
  {
   public:
   virtual ~base()
    {
    cout<<"base::~base()"<<endl;
    }
   
  };
  
  class derived:public base
  {
  public:
  ~derived()
  {
  cout<<"derived::~derived()"<<endl;
  }
 
   };
  
 int main()
 {
    
    base *pb=new derived;
    delete pb;
 
return 0;
 }



Output:


 derived::~derived()
 base::~base()

 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值