C++存在构造函数与析构函数,继承中也存在构造和析构函数。继承中的构造和析构函数与普通的构造析构有细微差别。

赋值兼容性原则

#include "iostream"
using namespace std; class Parent
{
public:
void printP()
{
printf("父类\n");
}
protected:
int a;
int b;
}; class Child : public Parent
{
public:
Child()
{
a = 0; b = 0; c= 0;
}
void printC()
{
printf("子类\n");
}
protected:
private:
int c;
}; void howToPrint(Parent *p)
{
p->printP();
} void howToPrint2(Parent &p)
{
p.printP();
} void main()
{
Parent p1;
p1.printP();
Child c1;
c1.printC(); Parent *base = NULL;
base = &c1;
//可以把子类对象赋给基类指针
//子类就是一种特殊的父类
base->printP(); Parent &myp = c1;
myp.printP(); //测试父类指针,做函数参数
howToPrint(&p1);
howToPrint(&c1); //测试父类引用,做函数参数
howToPrint2(p1);
howToPrint2(c1); //可以用子类对象来初始化父类对象
Parent p3 = c1; system("pause");
}
  • 子类对象可以当作父类对象使用
  • 子类对象可以直接赋值给父类对象
  • 子类对象可以直接初始化父类对象
  • 父类指针可以直接指向子类对象
  • 父类引用可以直接引用子类对象

    总结:子类就是特殊的父类 (base *p = &child;)

继承中的对象模型

  • 类在C++编译器的内部可以理解为结构体
  • 子类是由父类成员叠加子类新成员得到的

继承中构造和析构

  • 在子类对象构造的时,需要调用父类构造函数对其继承得来的成员进行初始化
  • 在子类对象析构的时,需要调用父类析构函数对其继承得来的成员进行清理

继承中的构造析构调用原则

class Parent
{
public:
Parent(int a)
{
···;
}
···
}; class Child : public Parent
{
public:
Child() : Parent(10)
{
···;
}
···
};
  • 子类对象在创建时会首先调用父类的构造函数
  • 父类构造函数执行结束后,执行子类的构造函数
  • 当父类的构造函数有参数时,需要在子类的初始化列表中显示调用
  • 析构函数调用的先后顺序与构造函数相反

继承与组合混搭情况下,构造和析构调用原则

#include <iostream>
using namespace std; class Object
{
public:
Object(const char* s)
{
cout<<"Object()"<<" "<<s<<endl;
}
~Object()
{
cout<<"~Object()"<<endl;
}
}; class Parent : public Object
{
public:
Parent(const char* s) : Object(s)
{
cout<<"Parent()"<<" "<<s<<endl;
}
~Parent()
{
cout<<"~Parent()"<<endl;
}
}; class Child : public Parent
{
protected:
Object o1;
Object o2;
public:
Child() : o2("o2"), o1("o1"), Parent("Parameter from Child!")
{
cout<<"Child()"<<endl;
}
~Child()
{
cout<<"~Child()"<<endl;
}
}; void run()
{
Child child;
} int main(int argc, char *argv[])
{
cout<<"demo05_extend_construct_destory.cpp"<<endl;
run(); system("pause");
return 0;
}

原则:先构造父类,再构造成员变量、最后构造自己;先析构自己,在析构成员变量、最后析构父类。先构造的对象,后释放

继承中的同名成员变量处理方法

  • 当子类成员变量与父类成员变量同名时
  • 子类依然从父类继承同名成员
  • 在子类中通过作用域分辨符::进行同名成员区分
  • 同名成员存储在内存中的不同位置

C++学习笔记-继承中的构造与析构的更多相关文章

  1. C++ 类的继承三(继承中的构造与析构)

    //继承中的构造与析构 #include<iostream> using namespace std; /* 继承中的构造析构调用原则 1.子类对象在创建时会首先调用父类的构造函数 2.父 ...

  2. java学习笔记-继承中super关键字

    背景: 在java继承的概念中我们得知,被声明为私有的类成员对所属的类来说仍然是私有的.类之外的任何代码都不能访问,包括子类. super关键字的两种用法: 1.用于调用超类的构造函数: 2.用于访问 ...

  3. C++语法小记---继承中的构造和析构顺序

    继承中构造和析构的顺序 先父母,后客人,最后自己 静态变量和全局变量在最开始 析构和构造的顺序完全相反 #include <iostream> #include <string> ...

  4. C++继承中的构造和析构

    1,构造:对象在创建的后所要做的一系列初始化的工作: 析构:对象在摧毁之前所要做的一系列清理工作: 2,思考: 1,子类中如何初始化父类成员? 1,对于继承而言,子类可以获得父类的代码,可以获得父类中 ...

  5. Swift难点-继承中的构造规则实例具体解释

    关于继承中的构造规则是一个难点. 假设有问题,请留言问我. 我的Swift新手教程专栏 http://blog.csdn.net/column/details/swfitexperience.html ...

  6. ArcGIS案例学习笔记-点集中最近点对和最远点对

    ArcGIS案例学习笔记-点集中最近点对和最远点对 联系方式:谢老师,135-4855-4328,xiexiaokui@qq.com 目的:对于点图层,查找最近的点对和最远的点对 数据: 方法: 1. ...

  7. 《Cocos2d-x游戏开发实战精解》学习笔记3--在Cocos2d-x中播放声音

    <Cocos2d-x游戏开发实战精解>学习笔记1--在Cocos2d中显示图像 <Cocos2d-x游戏开发实战精解>学习笔记2--在Cocos2d-x中显示一行文字 之前的内 ...

  8. JavaScript学习笔记——JS中的变量复制、参数传递和作用域链

    今天在看书的过程中,又发现了自己目前对Javascript存在的一个知识模糊点:JS的作用域链,所以就通过查资料看书对作用域链相关的内容进行了学习.今天学习笔记主要有这样几个关键字:变量.参数传递.执 ...

  9. 电磁兼容性设计学习笔记--PCB中地的布局

    http://bbs.ednchina.com/BLOG_ARTICLE_3010439.HTM PCB上元器件的布局对整个PCB板的电磁兼容性影响很大,所以从事硬件电路设计的工程师很有必要学习PCB ...

随机推荐

  1. django-session的使用---文件session型

    3.文件Session a. 配置 settings.py       SESSION_ENGINE = 'django.contrib.sessions.backends.file'    # 引擎 ...

  2. 【Android-布局复用】 多个界面复用一个布局文件(一)

    1.layout_common.xml 复用的布局文件 <?xml version="1.0" encoding="utf-8"?> <!-- ...

  3. EasyLogging++学习笔记(1)—— 简要介绍

    对于有开发经验的程序员来说,记录程序执行日志是一件必不可少的事情.通过查看和分析日志信息,不仅可以有效地帮助我们调试程序,而且当程序正式发布运行之后,更是可以帮助我们快速.准确地定位问题.在现在这个开 ...

  4. Java项目出现的问题01----学习

    0 运行环境 MyEcplise2016+Tomcat8.0 1 今天在html的表格提交跳转时发现,想要提交到自己写servlet程序中,却发现总是出错http://localhost:8080/T ...

  5. conda 激活环境失败解决办法

    https://stackoverflow.com/questions/41746137/conda-environment-is-discoverable-but-not-activateable- ...

  6. The Road to SDN: An Intellectual History of Programmable Networks

    文章名称:The Road to SDN: An Intellectual History of Programmable Networks 文章来源:Feamster N , Rexford J , ...

  7. ARTS打卡计划第十一周

    Algorithms: https://leetcode-cn.com/problems/linked-list-cycle/ 链表环. Review: “What I learned from do ...

  8. BigDecimal常用的加减乘除算法、比较大小、不展示多余的零、保存两位小数点

    项目中涉及到了BigDecimal的加.减.乘.比较大小.精确度的问题.所以在此总结一下,方便以后复习. //加法 BigDecimal coins = new BigDecimal("0& ...

  9. DIV盒子模型介绍 div用法

  10. CodeIgniter启用缓存和清除缓存的方法

    Codeigniter支持缓存技术,以达到最快的速度.尽管CI已经相当高效了,但是网页中的动态内容.主机的内存CPU和数据库读取速度等因素直接影响了网页的加载速度.依靠网页缓存,你的网页可以达到近乎静 ...