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. 解决安装Anaconda后ZSH中使用的依然是系统自带的Python

    最近重装了Anaconda,pip是Anaconda的pip,可是python是系统的python.如下图. 最开始检查了很久是环境变量的问题,其实不是.需要执行conda init zsh

  2. spring的finishBeanFactoryInitialization方法分析

    spring源码版本5.0.5 概述 该方法会实例化所有剩余的非懒加载单例 bean.除了一些内部的 bean.实现了 BeanFactoryPostProcessor 接口的 bean.实现了 Be ...

  3. PHP mysqli_get_connection_stats() 函数

    定义和用法 mysqli_get_connection_stats() 函数返回有关客户端连接的统计. 语法 mysqli_get_connection_stats(connection); 返回有关 ...

  4. QueryList之flatten方法

    正确用法: $data = $ql->get($url)->query()->getData();$data = $data->flatten()->all(); 注意: ...

  5. PAT 甲练习 1003 Emergency

    1003 Emergency (25 分) As an emergency rescue team leader of a city, you are given a special map of y ...

  6. import torch错误解决

    import torch出现 ”from torch._C import * ImportError: DLL load failed: 找不到指定的模块“错误这里torch=1.0.1,torchv ...

  7. c 判断是否为非控制字符

    #include <stdio.h> #include <wctype.h> int main () { ; wchar_t str[] = L"first line ...

  8. 【零基础】搞懂GPU为什么比CPU“快”

    一.前言 近几年深度学习在各领域大显神威,而”GPU加速"也得到了越来越多的篇幅,似乎任何程序只要放到GPU上运行那速度就是杠杠的.GPU代替CPU计算已成了大势所趋?我先告诉你结论”那是不 ...

  9. 0ctf-ezdoor-复现分析

    在学习opcache的时候,看到了这个题目,刚好有环境,就来复现一下,这个题目也让我学到了很多. 创建镜像: docker build -t 0ctf-ezdoor . 启动容器: docker ru ...

  10. Qt 单元测试

      使用Qtcreator 自带的单元测试工具框架QTestlib进行测试. 一.创建一个单元测试程序 new project->other project ->Qt unit test ...