IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> C++笔记-继承 -> 正文阅读

[C++知识库]C++笔记-继承

从已存在的类派生新类;基类/父类(base class) —>派生类/子类(derived class)

继承:单继承和多继承

class derived : public A (,public B)
{
/*******/
};

继承方式:public protected private.不指明继承方式,默认为protected或private.

派生类继承基类的所有成员,其中部分不可见(都继承,只是一部分不可见)

继承条件下的私有成员:

基类的私有成员在派生类不可见,但派生类对象会为基类中的所有私有成员分配空间;派生类可以通过间接的方式(调用从基类继承的公有成员函数)访问基类的私有成员。

改变访问限制:

using 声明改变成员在派生类中的访问限制。

名字隐藏:

派生类添加的数据成员与基类的数据成员同名,新成员会隐藏原来的成员;派生类添加了与基类同名的成员函数,新函数隐藏原函数。

间接继承:继承链路。

保护成员:

无继承时:保护成员仅在本类中可见。

有继承时:保护成员在派生类可见。

派生类可以访问从基类继承来的保护成员,但是不能访问基类对象的成员(基类对象属于基类)。

public继承方式:

基类成员派生类中是否可见访问情况
public可见任意函数可访问
protected可见被基类的其他成员函数和类层次结构中的所有成员函数访问
private不可见只被基类的成员函数访问(除friend函数)

一般避免将数据成员设计为保护类型,而是采取私有数据成员与保护性访问函数结合的模式,便于实现数据隐藏。

继承机制下的构造函数:(构造函数不能被继承?)

当创建一个派生类对象时,基类的构造函数被自动调用,用来对派生类对象中的基类部分进行初始化;派生类定义了自己的构造函数,则由该构造函数负责对象中“派生类添加部分”的初始化工作

如果基类拥有构造函数但没有默认构造函数,那么派生类的构造函数必须显式地调用基类的某个构造函数 。

继承与构造函数:

创建派生类对象时,必须显式或隐式地调用基类的某个构造函数。

继承与析构函数:

在类层次结构中,构造函数按照基类到派生类的顺序执行,析构函数按派生类到基类的顺序执行。

每个类至多一个析构函数,调用时不会产生二义性,因此在派生类中无需显式调用其他析构函数

关于多继承:派生类具有多个基类,同时继承这些基类的所有成员。

单继承基类与派生类组成树结构;多继承基类与派生类组成有向图结构。

在派生类的对象中,完全由基类中声明的成员构成的封装体称为基类子对象。该对象由基类中的构造函数初始化。

派生类的构造函数只初始化在派生类中声明的数据成员。

数据成员的初始化顺序取决于它们在类中被声明的顺序,而与它们在成员初始化列表中出现的顺序无关;多继承情况下,基类构造函数的执行顺序按它们在被继承时所声明的顺序(从左到右)依次调用,与它们在初始化列表中的顺序无关

多继承的命名冲突:派生类与基类、基类与基类的命名冲突(类名+域解析符)

由于多继承结构复杂,可能出现派生类从同一个间接基类多次继承的情况。

基类子对象B在派生类C中存储2份,访问这2个子对象的成员时,需要给出访问路径,这样才能避免二义性问题。

虚基类:

希望多继承时只存储一个公共基类,可使用虚基类。例如:

?用关键字virtual将基类B的直接派生类B1、B2指为虚基类,这样在建立C的对象时,这些同名的虚基类在该对象中只产生一个虚基类子对象。

图示:

虚基类具有的特性:减少公共基类的存储量,减少二义性问题;virtual只对紧随其后的基类名起作用;一个类在一个类格中既可以被用作虚基类,也可以被用作非虚基类。

关于虚基类的一个示例:

#include <iostream>
using namespace std;

class A {
public:
	int i;
	void showa() { cout << "i=" << i << endl; }
};

class B :virtual public A {
public:
	int j;
};

class C :virtual public A {
public:
	int k;
};

class D :public B, public C {
public:
	int p;
};

int main() {
	A a;
	B b;
	C c;
	a.i = 1;
	a.showa();
	b.i = 2;
	b.showa();
	c.i = 3;
	c.showa();
	//*******
	D d;
	d.i = 4;
	d.showa();
    //*******
	cout << "Hello world!" << endl;
	return 0;
}

输出:

?C++规定,在一个成员初始化列表中出现对虚基类和非虚基类构造函数的调用,则虚基类的构造函数先于非虚基类的构造函数的执行.

私有继承方式:默认的派生关系。不特别声明派生关系时认为是private继承。

此条件下,基类的public、protected类型成员在派生类中为private型;基类的private类型成员在派生类中不可见。

保护继承方式:

基类中的公有成员和保护成员在派生类中是保护成员,基类中的私有成员仅在基类中可见。

————————2021-11-10-22:51————————

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2021-11-11 12:32:24  更:2021-11-11 12:34:08 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 5:30:21-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码