涉及到本文所讲知识点的博文:
C++之析构函数探究
C++之常引用和浅拷贝探究
C++之一个函数链的简单例子(分文件实现)
C++之Big Three:拷贝构造、拷贝赋值、析构函数探究
C++之操作符重载探究(五):赋值运算符重载和拷贝赋值函数(深拷贝)
C++之继承探究(六):虚函数和多态

  ♠\spadesuit♠ 由于构造函数、析构函数不能被继承,子类如果需要的话,必须自己实现。

  ♠\spadesuit♠ 在子类中构造一个对象时,先调用父类的构造函数来构造子类继承自父类部分。派生类的构造函数只需要初始化自己扩展部分。

  ♠\spadesuit♠ 由于析构函数不需要任何参数,调用子类的析构函数会自动调用父类的析构函数,以完成其工作。

  ♠\spadesuit♠ 构造子类时,先执行父类的构造函数,然后执行子类的构造函数。

  ♠\spadesuit♠ 析构子类时,先执行子类的析构函数,然后执行父类的析构函数。

例:

附上例代码:

//小问学编程
#include<iostream>
#include<cstring>
using namespace std;//Base类
class Base
{public://default constructorBase(int a=0,char* s=""):id(a){if(!s){name=NULL;}else{name=new char[strlen(s)+1];strcpy(name,s);}cout<<"base default constructor\n";}//copy constructorBase(const Base& b):id(b.id){if(!b.name){name=NULL;}else{name=new char[strlen(b.name)+1];strcpy(name,b.name);}cout<<"base copy constructor\n";}//destructor~Base(){if(name!=NULL)delete[] name;cout<<"base destructor\n";}const Base& operator=(const Base& b);friend ostream& operator<<(ostream&,const Base&);
protected:int id;char* name;
};const Base& Base::operator=(const Base& b)
{if(this!=&b)//check if an object is assigned to itself{id=b.id;//destory the old objectdelete[] name;if(!b.name){name=NULL;}else{name=new char[strlen(b.name)+1];strcpy(name,b.name);}}cout<<"base assignment operator\n";return *this;
}ostream& operator<<(ostream& os,const Base& b)
{os<<"Base member id="<<b.id<<endl;os<<"Base member name="<<b.name<<endl;return os;
}//Derived类
class Derived:public Base
{public://defaultDerived(int a=0,char* s="",float x=0,char* t=""):Base(a,s),f(x){if(!t){label=NULL;}else{label=new char[strlen(t)+1];strcpy(label,t);}cout<<"derived default constructor\n";}//copy constructorDerived(const Derived& d):Base(d),f(d.f){if(!d.label){label=NULL;}else{label=new char[strlen(d.label)+1];strcpy(label,d.label);}cout<<"derived copy constructor\n";}//destructor~Derived(){delete[] label;cout<<"derived destructor\n";}const Derived& operator=(const Derived& d);friend ostream& operator<<(ostream&,const Derived&);
private:float f;char* label;
};const Derived& Derived::operator=(const Derived& d)
{if(this!=&d){delete[] label;Base::operator=(d);//Assign the Base part of d to the Base//part of the object that calls this operator;//(Base)(*this)=(Base&)d;f=d.f;if(!d.label){label=NULL;}else{label=new char[strlen(d.label)+1];strcpy(label,d.label);}cout<<"derived assignment operator\n";}return *this;
}ostream& operator<<(ostream& os,const Derived& d)
{os<<(Base&)d;//convert d to Base object to output Base members.os<<"Derived member f= "<<d.f<<endl;os<<"Derived member label= "<<d.label<<endl;return os;
}int main()
{Derived d1;Derived d2(d1);return 0;
}

运行结果:

C++之继承探究(十二):子类的构造、析构和赋值运算符重载相关推荐

  1. C++之继承探究(十):抽象基类与纯虚函数

    前文:C++之继承探究(九):多态的代价 抽象基类与纯虚函数   ♠\spadesuit♠ 纯虚函数:虚函数只有声明,函数体=0,就是一个纯虚函数,纯虚函数没有函数体,不需要实现.在子类里实现纯虚函数 ...

  2. C++之继承探究(五):子类对象作父类对象使用

    前文:C++之继承探究(四):继承的使用 把子类对象当作父类对象使用 分三种情况:   (1) 将子类对象赋值给父类对象.    --把等号右边的子类对象,赋值给等号左边的父类对象时,仅仅是把子类中来 ...

  3. C++新特性探究(十二):static_assert(提前判误)

    相关博文:C++之异常处理探究 相关博文:assert.if else.try catch三者的区别 相关博文:C++之assert.NDEBUG探究 相关博文:static_assert和asser ...

  4. C++之指针探究(十二):指针、下标、数组及其作函数参数

    指针使用下标时,可以理解为数组. 例如:   char ∗\ast∗p = "abcdef";   此时p[2]值为'c':   而p表示字符串"abcdef" ...

  5. java重载方法math_Java语言程序设计(十二)Math数学类,方法重载及变量作用域...

    1.重载方法 上一篇文章用到的max方法只能用于int型数据类型,但是如果需要决定两个浮点数中哪个较大,解决方法是创建另一个方法名相同但参数不同的方法,代码如下: public static doub ...

  6. C++之继承探究(十一):多重继承、菱形继承、虚继承、二义性问题及其解决方案

    前文:C++之继承探究(十):抽象基类与纯虚函数 多重继承: 例1:两个父类中的同名函数如何区分示例 解决方法:在子类对象调用print( )函数时加上某个父类的作用域符号. 附上例代码: //小问学 ...

  7. C++之继承探究(九):多态的代价

    前文:C++之继承探究(八):动态绑定 多态:   用父类指针or引用,统一操作各种子类对象(也包括父类对象)(父类的指针或引用有多种形态).     为了实现动态绑定,编译器会为每一个包含虚函数的类 ...

  8. C++之指针探究(十六):typedef结合函数指针

    相关博文:C++之指针探究(十三):函数指针数组 相关博文:C++之指针探究(十二):指针.下标.数组及其作函数参数探究 相关博文:C++之指针探究(十一):函数名的本质和函数指针 相关博文:C++之 ...

  9. C++之指针探究(十五):回调函数应用之qsort排序

    相关博文:C++之指针探究(十三):函数指针数组 相关博文:C++之指针探究(十二):指针.下标.数组及其作函数参数探究 相关博文:C++之指针探究(十一):函数名的本质和函数指针 相关博文:C++之 ...

最新文章

  1. el图片滚动_element的el-table中记录滚动条位置的示例代码
  2. 几个C++问题提示的莫名其妙,附录解决方法
  3. 200万!这所“双一流”也开始高薪抢人了!
  4. Visual Studio Xamarin中找不到iOS模拟器
  5. C/C++ unsigned char*类型
  6. js reduce实现中间件_实现redux中间件-洋葱模型
  7. 项目开发管理工具---GitHub(一)
  8. 会议交流 | DataFunSummit 知识图谱在线峰会——链接知识图谱最前沿技术和最落地产业化应用的桥梁!...
  9. python数字位数重排_Python面试题:给定一组非负整数,重新排列它们的顺序使之组成一个最大的整数...
  10. java定时任务_java:springBoot使用@Scheduled注解配置定时任务
  11. Redis-槽道原理
  12. 【CSDN浏览器助手9月新版本】免费插件让你享受VIP待遇!
  13. ubuntu 安装360浏览器
  14. 用pc抓取vlan tag数据包
  15. Photoshop辅助线和标尺的技巧
  16. 各种标点符号的英文怎么念
  17. CodeBlocks 主题美化(编辑器修改主题)
  18. 计算机网络营销发展有哪些方面,《网络营销》(PPT124).ppt
  19. hostiko模板-WHMCS自适应模板-略站网
  20. redis过期策略与淘汰策略

热门文章

  1. 搭建外文技术博客程序员都应该有自己的博客
  2. java怎么看提示错误,Mabatis错误提示Parameter index out of range的处理方法
  3. dev下没有ttyusb_Dev C++ 软件安装教程
  4. Windows Azure VM Role (2) 创建VHDVHD
  5. meta标签以及一些基本标签
  6. Magisk —— 安卓新一代的第三方拓展,systemless模式
  7. 【agc004d】Teleporter
  8. apidoc @apiGroup兼容中文
  9. Introduction to Mathematical Thinking - Week 4
  10. .Net 转战 Android 4.4 日常笔记(1)--工具及环境搭建