当前位置: 首页 > news >正文

C++_继承

介绍

  • 继承的基本概念
    1.共性和个性 (PS:有相同的属性 但是 又有自己的特点)
  • 基类和子类
    1. 基类(父类) = 共性
    2. 子类(派生类) = 个性(特点)
  • 继承语法
    1.class 子类名:继承方式1 基类1,继承方式2 基类2{ 行为 };
  • 继承方式(PS:默认继承方式为:私有继承)
    1.公有继承: public
    2.保护继承: protected(PS:在子类中可以看到,子类可以访问)
    3.私有继承: private(PS:在子类中可以看到,但是无法访问)
  • 继承的使用场景
    1.创建的新类与现有的类相似,只是多出若干成员变量或成员函数时,可以使用继承。不但减少代码量,而且新类会拥有基类所有功能
    2.需要创建多个类,它们拥有很多相似的成员变量或成员函数时,可以使用继承。将这些类的共同成员提取出来,定义为基类,然后从基类继承,既可以代码复用,也方便后期维护
  • 继承注意事项
    1.在子类中定义基类同名的 公有成员和保护成员,子类中的成员会 隐藏 基类中的 同名成员,想访问被隐藏的成员,通过作用域限定符(::)+成员名 可以访问 被隐藏的基类成员
    2.在基类中构造函数设置为私有成员的化,子类无法进行继承
    3.子类初始化 基类成员变量 或者 函数需要显示构造

2.1基类成员初始化方法一:Student(string name, int age = 0, string gender = "男"):Person(name, age, gender){}//三参构造(PS:需要 基类有三参构造函数)
2.2基类成员初始化方法二:Student(string name, int age = 0, string gender = "男"){m_name = name;m_gender = gender;oage(age);}//无参构造(PS:需要 基类有默认无参构造函数)

公有继承特点

1.子类可以 直接访问 基类所有的 公有和保护成员,其效果如同它们是在子类中声明一样
2.对于基类的 私有成员,在子类中存在 但无法访问
3.子类对象 任何时候都可以被当成 基类对象

保护继承特点

1.使基类 公有成员 和 保护成员 进行保护化,只禁止外部通过该子类访问
2.子类指针 或 引用 不能隐式转换成基类类型 指针或引用

私有继承特点

1.将基类公有和保护成员私有化,禁止外部通过该子类访问,也禁止该子类的子类进行访问
2.子类指针 或 引用 不能隐式转换成基类类型 指针或引用

继承方式与访问控制

在这里插入图片描述

公有继承 保护继承 私有继承区别源码

#include<iostream>
#include<string>
using namespace std;
//基类A
class A
{public:int m_pub;//公有成员变量
protected:int m_pro;//保护成员变量
private:int m_pri;//私有成员变量
};
//子类B
class B:protected A//保护继承基类,在全局中是无法通过 子类去访问基类(包括子类的子类也无法访问)
{
public:void foo(){cout << m_pub << " " << m_pro << endl;}
};
//子类C
class C :private B//私有继承,无法访问任何成员
{
public://B::foo();//无法访问B类中成员函数
};
void main()
{A a;a.m_pub = 10;B b;//b.m_pub;//可以看见,但是无法访问system("pause");
}

子类内存布局

子类对象内存布局图:
在这里插入图片描述

源码

#include<iostream>
#include<string>
using namespace std;class A
{
public:A(){ cout << "A构造" << endl; }~A(){ cout << "A析构" << endl; }
};
class Person:public A//人
{
public://默认构造函数Person(){ cout << "Person构造" << endl; }//构造函数Person(string name, int age, string gender) :m_name(name), m_age(age), m_gender(gender){}//析构函数~Person(){ cout << "Person析构" << endl; }
public:void eat(){ cout << "吃饭" << endl; }void sleep(){ cout << "睡觉" << endl; }//打印函数void print(){cout << m_name << " " << m_age << " " << m_gender << endl;}//获取年龄int oage(int age){return m_age = age;}
protected:string m_name;//名字string m_gender;//性别
private:int m_age;//年龄
};
//子类 学生
class Student:public Person//人
{
public://构造函数Student(string name, int age = 0, string gender = "男")/*:Person(name, age, gender)//三参构造*/{cout << "Student构造" << endl;//基类成员初始化方法二m_name = name;m_gender = gender;oage(age);}//打印void study(){eat();cout << "学习" << endl;m_name = "一航";}~Student(){cout << "Student析构" << endl;}
};
void main()
{
//构造 and 析构流程测试{//构造子类对象Student stu("一航");cout << "--------------分隔符--------------" << endl;//函数调用stu.study();cout <<"--------------分隔符--------------"<< endl;//拷贝子类对象操作Person*Ph1 = &stu;Person&Ph2 = stu;//打印结果Ph1->print();Ph2.print();cout << "--------------分隔符--------------" << endl;}system("pause");
}

运行结果

A构造
Person构造
Student构造
--------------分隔符--------------
吃饭
学习
--------------分隔符--------------
一航 0 男
一航 0--------------分隔符--------------
Student析构
Person析构
A析构
请按任意键继续. . .
http://www.lryc.cn/news/275506.html

相关文章:

  • Java-IO流-15
  • java中使用redis
  • Mongodb的可重试读操作
  • 2024年1月2日-1月7日(ue5底层渲染+ue arpg+项目需求)
  • MySQL中的视图和触发器
  • uView-UI v2.x常见问题整理
  • MBTI职业性格测试 28题(免费版)
  • Springcloud 微服务实战笔记 Ribbon
  • CSS基础笔记-04cascade-specificity-inheritance
  • Spring应用的部署与管理
  • B端产品经理学习-需求挖掘
  • 整数规划基本原理
  • 秋招复习之堆
  • 算法训练营Day36(贪心-重叠区间)
  • 如何利用Oracle官方网站不登录账号下载和安装非最新版本的JDK(版本自由选择)
  • 税法相关的基础知识
  • ListNode 2487. 从链表中移除节点,单调栈的应用
  • vue3中pdf打印问题处理
  • 如何向嵌入式设备中添加tcpdump工具
  • 伦茨科技Apple Find My认证芯片-ST17H6x芯片
  • uni-app 前后端调用实例 基于Springboot 数据列表显示实现
  • python渗透工具编写学习笔记:10、网络爬虫基础/多功能编写
  • Python武器库开发-武器库篇之子域名扫描器开发(四十一)
  • 通俗易懂的15个Java Lambda表达式案例
  • 十七:爬虫-JS逆向(上)
  • How to implement anti-crawler strategies to protect site data
  • 王国维的人生三境界,这一生至少当一次傻瓜
  • Jmeter二次开发实操问题汇总(JDK问题,jar包问题)
  • 网络安全B模块(笔记详解)- 数字取证
  • 阿里云服务器8080端口安全组开通图文教程