C++三大特性之一:继承

文章目录


前言

C++三大特性:继承、多态和封装。继承是面向对象编程的一个核心概念,它允许我们根据一个已存在的类(基类或者叫父类),创建一个新的类(派生类或者叫子类),这个新的类继承了类的属性和行为。

一、继承方式

1.继承格式。class 子类名 :继承属性(public\protected\private)父类名{ ...}

2.注意父类名后面没有()

3.继承的子类调用继承过来的成员时候,直接写的是子类的名字调用

cpp 复制代码
class www {
public:
	void head() {
		cout << "头" << endl;
	}
	void wei() {
		cout << "尾" << endl;
	}
	void ce() {
		cout << "侧" << endl;
	}
};

class c :public www {
public:
	void cqq() {
		cout << "c++" << endl;
	}
};

二、继承类型

1.c++有三种继承类型:公有继承(public)、保护继承(protected)和私有继承(private)。

2.简记:私有继承子类是不能继承的,公有和保护继承要看优先级

继承中构造和析构的顺序

1.构造顺序:首先是父类的构造、然后是子类的构造。

2.析构顺序:首先是子类的析构。然后是父类的析构。

cpp 复制代码
#include<iostream>
using namespace std;

class dad {
public:
	dad() {
		cout << "dad的构造函数已调用:  " << endl;
	}
	~dad() {
		cout << "dad的析构函数已调用" << endl;
	}
};

class son :public dad {
public:
	son() {
		cout << "son的构造函数已调用: " << endl;
	}
	~son() {
		cout << "son的析构函数已调用" << endl;
	}
};


void test() {
	son s1;
}

int main() {

	test();
	
	system("pause");
	return 0;

}

输出:

继承中的内存分配

1.父类的非静态成员都会被继承(也就是除了static的)

2.私有属性也会被继承,只是被隐藏 了

3.3.应用菜单:开发人员命令提示工具查看对象 Developer Command Prompt for VS 2017

  • cd 具体路径下 进入文件中
  • dir查看文件
  • cl /d1 reportSingleClassLayoutson xxxx.cpp就出来了。记忆:报告单个类布局类名 文件名
cpp 复制代码
#include<iostream>
using namespace std;
#include<string>

class dad {
public:
	int a;
private:
	int b;
protected:
	int c;
};

class son :public dad {
public:
	int d;
};

void test() {
	son s1;
	cout << "son的长度为:  " << sizeof(s1) << endl;
}

int main() {
	test();

	system("pause");
	return 0;

}

输出

多继承语法(非重点)

1.公式:class 子类:public 父类1,public 父类2{...}

2.如果继承的两个父类都有同名成员,调用的时候一定要加作用域

3.实际开发不要用那么多多继承,可能存在两个人写两个父类,成员名相同

继承中同名静态成员的处理

1.静态成员变量是类级别的,而不是对象级别的。在子类和父类中,如果有同名的静态成员变量,它们被视为两个独立的变量。

继承一般在哪里用到

1.在游戏开发中,继承经常用于创建角色、物品、敌人等游戏对象的层次结构。例如,一个 Enemy 类可能继承自一个更通用的 GameObject 类,而不同类型的敌人(如 BossEnemy 或 MinionEnemy)则可以进一步继承自 Enemy 类。

进阶:菱形继承和虚拟继承

1.菱形继承指的是,父类A有两个子类B1和B2,但是C使用多继承了B1和B2。当C调用A的成员函数时,有两条路径达到A那里。会造成混乱

2.解决菱形继承的方法就是虚拟继承,B1和B2在继承A时候使用虚拟继承。`class 子类名:virtual public 父类{};

cpp 复制代码
class Animal
{
public:
	int m_Age;
};

//继承前加virtual关键字后,变为虚继承
//此时公共的父类Animal称为虚基类
class Sheep : virtual public Animal {};
class Tuo   : virtual public Animal {};
class SheepTuo : public Sheep, public Tuo {};

void test01()
{
	SheepTuo st;
	st.Sheep::m_Age = 100;
	st.Tuo::m_Age = 200;

	cout << "st.Sheep::m_Age = " << st.Sheep::m_Age << endl;
	cout << "st.Tuo::m_Age = " <<  st.Tuo::m_Age << endl;
	cout << "st.m_Age = " << st.m_Age << endl;

}
int main() {

	test01();
	
	system("pause");
	
	return 0;

}

4.虚拟继承可能会引入一些额外的开销,因为它需要维护一个指向共享基类的指针或偏移量,以确保正确地访问基类成员。因此,在设计类结构时应该仔细考虑是否真正需要虚拟继承。

总结

主要理解继承的方式,继承的类型有三种,私有属性无论哪种继承都不可以调用的,但是内存是占用的。继承是把非静态成员都继承了,同名静态成员的调用需要指明作用域。使用虚拟继承可以解决菱形继承的问题,但是会导致内存开销变大。

相关推荐
源代码•宸21 小时前
goframe框架签到系统项目开发(用户认证、基于 JWT 实现认证、携带access token获取用户信息)
服务器·开发语言·网络·分布式·后端·golang·jwt
郝学胜-神的一滴21 小时前
Linux 多线程编程:深入理解 `pthread_join` 函数
linux·开发语言·jvm·数据结构·c++·程序人生·算法
feifeigo12321 小时前
MATLAB微光图像增强综合实现
开发语言·计算机视觉·matlab
Trouvaille ~21 小时前
【C++篇】C++11新特性详解(二):右值引用与移动语义
c++·stl·基础语法·右值引用·默认成员函数·完美转发·移动语义
罗湖老棍子21 小时前
瑞瑞的木板(洛谷P1334 )
c++·算法·优先队列·贪心·哈夫曼树
黎雁·泠崖21 小时前
C 语言底层核心:数据在内存中的存储(大小端 + 整数 + 浮点型全解析)
c语言·开发语言
崇山峻岭之间21 小时前
Matlab学习记录14
开发语言·学习·matlab
lly20240621 小时前
CSS 颜色名详解
开发语言
Biomamba生信基地21 小时前
用R语言画生信基地圣诞树~
开发语言·r语言·单细胞·空间转录组·biomamba生信基地
Nakkhon21 小时前
软件工程实践——个人技术博客
java·开发语言