继承中的构造函数和析构函数

继承中的构造和析构顺序

  1. 子类创建对象时,先调用父类的构造,然后调用自身构造
  2. 析构顺序与构造顺序相反
  3. 子类不会继承父类的构造函数和析构函数
  4. 如果父类中没有合适默认构造,那么子类可以利用初始化列表的方式显示的调用父类的其它构造
#include<iostream>using namespace std;class Base
{
public:Base(){cout << "Base默认构造函数调用" << endl;}~Base(){cout << "Base的析构函数的调用" << endl;}
};
//子类会继承父类的成员属性,成员属性
//但是 子类 不会继承 父类 构造函数 和 析构函数
//只有父类自己知道如果构造和析构自己的属性,而子类不知道class Son :public Base
{
public:Son(){cout << "Son默认构造函数的调用" << endl;}~Son(){cout << "Son的析构函数的调用" << endl;}
};class Base2
{
public:Base2(int a){this->m_A = a;cout << "有参构造函数调用" << endl;}int  m_A;
};class Son2 :public Base2
{
public:Son2(int a)  : Base2(10) //利用初始化列表方式 显示调用 有参构造{}
};void test02()
{Son2 s2(1000);
}void test01()
{//Base b1;Son s1;
}int main()
{test01();system("pause");return 0;
}

注意:

  1. 派生类的构造函数必须调用基类的构造函数初始化基类的那一部分成员。如果基类没有默认的构造函 数,则必须在派生类构造函数的初始化列表阶段显示调用。
  2. 派生类的拷贝构造函数必须调用基类的拷贝构造完成基类的拷贝初始化。
  3. 派生类的operator=必须要调用基类的operator=完成基类的复制。
  4. 派生类的析构函数会在被调用完成后自动调用基类的析构函数清理基类成员。因为这样才能保证派生类 对象先清理派生类成员再清理基类成员的顺序。
  5. 派生类对象初始化先调用基类构造再调派生类构造。
  6. 派生类对象析构清理先调用派生类析构再调基类的析构

继承中同名成员

继承中的同名处理

  1. 成员属性 直接调用先调用子类,如果想调用父类,需要作用域
  2. 成员函数 直接调用先调用子类,父类的所有版本都会被隐藏,除非显示用作用域运算符去调用
#include<iostream>using namespace std;class Base
{
public:Base(){m_A = 100;}void fun(){cout << "Base func的调用" << endl;}void fun(int a){cout << "Base func(int a)的调用" << endl;}int m_A;
};class Son :public Base
{
public:Son(){m_A = 200;}void fun(){cout << "Son func的调用" << endl;}int m_A;
};void test01()
{Son s1;cout << s1.m_A << endl;//想调用 父类中的m_Acout << s1.Base::m_A << endl;//s1.fun(10);//调用父类的funcs1.Base::fun();
}
//如果父类和子类拥有同名的函数 属性 子类不会覆盖父类成员
//如果子类与父类的成员函数名称相同 子类会把父类的所有同名版本都隐藏掉
//想调用父类的方法,必须加作用域int main()
{test01();system("pause");return 0;
}

注意:

1. 在继承体系中基类和派生类都有独立的作用域。

2. 子类和父类中有同名成员,子类成员将屏蔽父类对同名成员的直接访问,这种情况叫隐藏,也叫重定 义。(在子类成员函数中,可以使用 基类::基类成员 显示访问)

3. 需要注意的是如果是成员函数的隐藏,只需要函数名相同就构成隐藏。

4. 注意在实际中在继承体系里面最好不要定义同名的成员。

继承中静态成员

  1. 类似非静态成员函数处理
  2. 如果想访问父类中的成员,加作用域即可
#include<iostream>using namespace std;class Base
{
public:static void func(){cout << "Base func()" << endl;}static void func(int a){cout << "Base func(int a)" << endl;}static int m_A;
};
int Base::m_A = 10;class Son :public Base
{
public:static void func(){cout << "Son func()" << endl;}static int m_A;
};int Son::m_A = 20;
//静态成员属性 子类可以继承下来
void test01()
{cout << Son::m_A << endl;//访问父类的m_Acout << Base::m_A << endl;Son::func();//访问父类中同名的成员函数Son::Base::func();
}int main()
{test01();system("pause");return 0;
}

注意:

  1. 静态成员和非静态成员都可以被继承到派生类中
  2. 如果重新定义一个静态成员函数,所有在基类中的其他重载函数会被隐藏
  3. 如果我们改变基类中一个函数的特征,所有使用该函数的基类版本都会被隐藏

c++中的继承--2(继承中的析构函数和构造函数,继承中同名成员,继承中静态成员)相关推荐

  1. C++继承中的同名成员变量处理方法

    1.当子类成员变量与父类成员变量同名时 2.子类依然从父类继承同名成员 3.在子类中通过作用域分辨符::进行同名成员区分(在派生类中使用基类的同名成员, 显式地使用类名限定符) 4.同名成员存储在内存 ...

  2. C++ 继承中的同名成员的情况01

    class Base { public:Base(){this->m_A = 100;}void func(){cout << "Base中的Func调用" &l ...

  3. Hibernate继承(2)子类属性生成在自己的一张表中,父类的属性一张表

    Hibernate继承(2)子类属性生成在自己的一张表中,父类的属性一张表 <?xml version="1.0"?> <!DOCTYPE hibernate-m ...

  4. C++继承机制(二)——继承中的构造和析构顺序、继承同名成员的处理方式

    目录: C++继承机制(一)--基本语法.三种继承方式.继承哪些数据 C++继承机制(二)--继承中的构造和析构顺序.继承同名成员的处理方式 C++继承机制(三)--多继承.菱形继承.虚继承原理 本篇 ...

  5. 在保护继承中基类的共有成员_c++中的继承

    类的继承,是新的类从已有类那里得到已有的特性.从另一个角度来看这个问题,从已有类产生新类的过程就是类的派生. 派生类的定义 class 派生类名:继承方式 基类名1,继承方式 基类名2 {派生类成员声 ...

  6. C++57个入门知识点_50 菱形继承与虚继承(C++中语法允许多重继承造成菱形继承;会造成近亲结婚的问题;可以通过虚继承的方式解决;实际项目中不多用多重继承)

    上篇C++57个入门知识点_49 多重继承与组合(一个类同时具有多个类的属性的方法:多重继承或者组合:多重继承:一个类同时继承多个类:多重继承构造和析构的顺序与普通继承类似:组合:类中包含多个成员对象 ...

  7. C++知识点61——typename与class、模板编程与继承、模板类和友元、类模板与static成员

    一.typename与class的异同 1.啥时候既可以使用typename,又可以使用class? 当表示模板参数的时候,二者没有区别 2.啥时候只能使用typename,不能使用class? 当模 ...

  8. 【Kotlin】Kotlin 类的继承 一 ( 类继承基本方式 | final 关键字 | 子类主构造函数 | 子类次构造函数 )

    文章目录 I . 类继承基本方式 II . 使用 final 禁止类继承 / 方法重写 III . 父类没有主构造函数 IV . 父类有主构造函数 V . 父类构造函数与子类构造函数总结 I . 类继 ...

  9. 线程中这么调用类_「手撕面试官」谈谈你对JDK中Executor的理解?

    欢迎关注头条号:Java小野猫 前言 随着当今处理器计算能力愈发强大,可用的核心数量越来越多,各个应用对其实现更高吞吐量的需求的不断增长,多线程 API 变得非常流行.在此背景下,Java自JDK1. ...

最新文章

  1. KVM中vhost-user简介(十三)
  2. Linux基础学习十:Linux的权限管理
  3. Size Balanced Tree
  4. 拿什么拯救我,我的爱人
  5. 在 windows 下安装 Boost 1.62.0
  6. qt将tablewidget导出为excel
  7. JAVA音频转换MP3转AMR互转
  8. 好用的dns服务器工具有哪些?
  9. 哀其不幸的墨西哥人工智能
  10. 巴菲特致股东的一封信:1999年
  11. 手机点击出现蓝色区域方块
  12. C++游戏---皇后PK
  13. Arranging Wine
  14. 威联通[vNAS內置虚拟机]体验评测 让企业实现无限可能
  15. 利用Python的pynput库解放双手之控制键盘
  16. SQL Server查询IP地址等信息
  17. 软件测试 流程有哪些
  18. 微信小程序实现文本两端对齐
  19. Java.SE01.多线程_案例01
  20. 嵌入式操作系统(LINUX)

热门文章

  1. timeval的时间转换成毫秒之后多大的数据类型可以装下
  2. TP3.2之WHERE组合条件处理
  3. 解决SimpleButton被移除后保持OVER状态
  4. hdu--4902--线段树
  5. 对上拉下拉电阻的作用作个总结(想了解的过来看看)(转载)
  6. 关于Asp.Net开发中导入外部JavaScript文件的问题
  7. 【转】TeeChart的用法
  8. 2010.07.13_19:30
  9. linux 无密码登录另一台服务器,ECS Linux服务器ssh免密码登录另外一台服务器的具体设置...
  10. Java 字符,整型,字符串三者转换