c++--面向对象特性

1.面向对象指的是继承,封装,多态。
继承主要关注类的构造,赋值,析构。
以下对多态,封装进行补充说明。

2、多态
2.1.定义
a.赋值
派生类的指针,可以赋值给基类的指针。
派送类的对象,可以赋值给基类的引用。
b.调用
通过基类指针调用基类虚函数时,若派生类提供了派生实现,则调用派生类版本。
通过基类引用调用基类虚函数时,若派送类提供了派送实现,则调用派生类版本。

2.2.最佳实践
基类的析构函数应该定义成虚函数。

#include <iostream>class Base
{
public:Base() {}virtual void fun(){printf("B_fun()\n");}virtual ~Base(){printf("~Base()\n");}protected:int m_pro;private:int m_pri;
};class A : public Base
{
public:A() : Base() {}void fun(){printf("A_fun()\n");}~A(){printf("~A()\n");}
};int main()
{A *pA = new A();Base *pB = pA;pB->fun();delete pB;A a;Base &b = a;b.fun();return 0;
}

在这里插入图片描述
2.3.注意点
多态针对类外部使用基类指针或基类引用调用基类虚函数时会发生。
多态针对基类内部调用虚函数,在隐式的this此时关联到派生实例时也会发生。

#include <iostream>class Base
{
public:Base() {}virtual void fun(){printf("B_fun()\n");}void fun1(){printf("B_fun1()\n");fun();}virtual ~Base(){printf("~Base()\n");}protected:int m_pro;private:int m_pri;
};class A : public Base
{
public:A() : Base() {}void fun(){printf("A_fun()\n");}~A(){printf("~A()\n");}
};int main()
{A *pA = new A();Base *pB = pA;pB->fun1();delete pB;A a;Base &b = a;b.fun1();return 0;
}

在这里插入图片描述
3.封装
3.1.访问权限修饰符
a.c++支持的访问权限修饰符有public,protect,private
b.在类型内部,针对类型自身所有成员(不含基类)具有全量(public,protect,private)访问权限。
c.在类型内部,针对类型基类,只能访问基类的public,protect修饰的成员。
c.在类型友元内部,具有等价于类型内部的访问权限。故对类型自身成员有全量访问权限,只能访问基类的public,protect修饰的成员。
d.在类型外部,针对类型自身成员,只对public成员具备访问权限。针对基类成员,只对public继承的基类的public成员具备访问权限。

#include <iostream>class Base
{// 类的友元--全量访问friend void friend_fun();
public:Base(int i, int j, int k) : m_pub(i), m_pro(j), m_pri(k) {}void fun(){// 类内部访问--全量访问printf("pub_%d,pro_%d,pri_%d\n", m_pub, m_pro, m_pri);}public:int m_pub;
protected:int m_pro;
private:int m_pri;
};class A1 : public Base
{friend void friend_funA1();public:A1(int i, int j, int k) : Base(i, j, k) {}void fun1(){// 公共继承者的内部--只能访问公共基类的public&protectprintf("pub_%d,pro_%d,pri_%d\n", m_pub, m_pro, 0);}
};// 保护继承
class A2 : protected Base
{friend void friend_funA2();
public:A2(int i, int j, int k) : Base(i, j, k) {}void fun1(){// 保护继承者的内部--只能访问保护基类的public&protectprintf("pub_%d,pro_%d,pri_%d\n", m_pub, m_pro, 0);}
};// 私有继承
class A3 : private Base
{friend void friend_funA3();public:A3(int i, int j, int k) : Base(i, j, k) {}void fun1(){// 私有继承者的内部--只能访问私有基类的public&protectprintf("pub_%d,pro_%d,pri_%d\n", m_pub, m_pro, 0);}
};void friend_fun()
{// 友元的内部--对类型自身成员全量访问Base b(1, 2, 3);printf("pub_%d,pro_%d,pri_%d\n", b.m_pub, b.m_pro, b.m_pri);
}void friend_funA1()
{// 友元的内部--对基类,公共基类的public&protectA1 b(1, 2, 3);printf("pub_%d,pro_%d,pri_%d\n", b.m_pub, b.m_pro);
}void friend_funA2()
{// 友元的内部--对基类,保护基类的public&protectA2 b(1, 2, 3);printf("pub_%d,pro_%d,pri_%d\n", b.m_pub, b.m_pro);
}void friend_funA3()
{// 友元的内部----对基类,私有基类的public&protectA3 b(1, 2, 3);printf("pub_%d,pro_%d,pri_%d\n", b.m_pub, b.m_pro, 0);
}int main()
{Base b(11, 22, 33);// 类不相干的外部--针对类自身成员,只能访问类自身的public成员。b.m_pub;A1 a1(2, 3, 4);// 类不相干的外部--针对类基类成员,只能访问公共基类自身的public成员。printf("pub_%d,pro_%d,pri_%d\n", a1.m_pub, 0, 0);// 类不相干的外部--针对类基类成员,只能访问公共基类自身的public成员。A2 a2(3, 4, 5);printf("pub_%d,pro_%d,pri_%d\n", 0, 0, 0);// 类不相干的外部--针对类基类成员,只能访问公共基类自身的public成员。A3 a3(4, 5, 6);printf("pub_%d,pro_%d,pri_%d\n", 0, 0, 0);
}

理解继承时,对基类的权限修饰。可以认为是指定基类成员被合并到派生类成员时,允许放入的权限区域。
对public继承,允许被放入public,protect,private区域。所以,按基类成员一致权限放入。
对protect继承,允许被放入protect,private区域。所以,基类public,protect成员放入protect区域;private成员放入private区域。
对private继承,允许被放入private区域。所以,基类成员一致放入private区域。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/210194.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

教师需要什么技能?

作为一名老师&#xff0c;需要掌握许多技能&#xff0c;以便能够成功地教育和指导学生。以下是一些关键技能&#xff1a; 1.教学技能&#xff1a;老师需要有深入的学科知识和教学经验&#xff0c;以便能够有效地传授知识。教师应该了解如何设计和执行教学计划&#xff0c;制定课…

【Java基础篇 | 面向对象】—— 聊聊什么是接口(下篇)

个人主页&#xff1a;兜里有颗棉花糖 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 兜里有颗棉花糖 原创 收录于专栏【JavaSE_primary】 本专栏旨在分享学习JavaSE的一点学习心得&#xff0c;欢迎大家在评论区交流讨论&#x1f48c; 上篇&#xff08;【Ja…

SpringBoot 自动装配原理详解

什么是 SpringBoot 自动装配&#xff1f; 我们现在提到自动装配的时候&#xff0c;一般会和 Spring Boot 联系在一起。但是&#xff0c;实际上 Spring Framework 早就实现了这个功能。Spring Boot 只是在其基础上&#xff0c;通过 SPI 的方式&#xff0c;做了进一步优化。 Spr…

解决npm install时报:gyp ERR! configure error

报错内容&#xff1a; npm ERR! gyp ERR! cwd C:\Users\zccbbg\code\my\examvue\node_modules\node-sass npm ERR! gyp ERR! node -v v16.13.1 npm ERR! gyp ERR! node-gyp -v v3.8.0 npm ERR! gyp ERR! not ok npm ERR! Build failed with error code: 1 解决办法&#xff1a;…

自行编写一个简单的shell!

本文旨在编写一个简单的shell外壳程序&#xff01;功能类似于shell的一些基本操作&#xff01;虽然不能全部实现shell的一些功能&#xff01;但是通过此文章&#xff0c;自己写一个简单的shell程序也是不成问题&#xff01;并且通过此文章&#xff0c;可以让读者对linux中一些环…

C#基础面试题集

C#基础 1. 简述值类型和引用类型有什么区别2. C# String类型比 stringBuilder 类型的优势是什么?3.面向对象的三大特点4.请简述private&#xff0c;public&#xff0c;protected&#xff0c;internal的区别5.结构体和类6.请描述Interface与抽象类之间的不同7.在类的构造函数前…

go自带rpc框架生产环境使用demo

基础使用 序列化使用自带gob协议 server package mainimport ("net""net/rpc" )// 定义一个handler结构体 type HelloService struct { }// 定义handler方法,大小写&#xff0c;参数&#xff0c;返回值都是固定的&#xff0c;否则无法注册 func (receiv…

数据库事务:保障数据一致性的基石

目录 1. 什么是数据库事务&#xff1f; 1.1 ACID特性解析 2. 事务的实现与控制 2.1 事务的开始和结束 2.2 事务的隔离级别 3. 并发控制与事务管理 3.1 并发控制的挑战 3.2 锁和并发控制算法 4. 最佳实践与性能优化 4.1 事务的划分 4.2 批处理操作 5. 事务的未来发展…

SpringSecurity6 | 自定义登录页面

✅作者简介&#xff1a;大家好&#xff0c;我是Leo&#xff0c;热爱Java后端开发者&#xff0c;一个想要与大家共同进步的男人&#x1f609;&#x1f609; &#x1f34e;个人主页&#xff1a;Leo的博客 &#x1f49e;当前专栏&#xff1a; Java从入门到精通 ✨特色专栏&#xf…

高工氢电年会 | 未势能源解超朋博士受邀出席并做主题演讲

12月4日&#xff0c;以“战略重构 商业觉醒”为主题的2023高工氢电年会在深圳举办&#xff0c;未势能源副总裁解超朋博士受邀出席开幕式论坛&#xff0c;以《把握机遇、直面挑战&#xff0c;迎接氢车规模化推广时代》为主题发表演讲&#xff0c;并参与圆桌论坛研讨。 氢势已来&…

【Linux】resolv.conf 文件

resolv.conf resolv.conf 文件 是 DNS 的 client 端使用的文件&#xff0c;用于设置 DNS 服务器的 ip 地址以及 DNS 域名&#xff0c;还可以配置域名搜索顺序等等。主要包含如下关键字&#xff1a;nameserver、domain、search、sortlist、options。设置的格式都是 关键字空格 …

管理类联考——数学——真题篇——按知识分类——数据

文章目录 排列组合2023真题&#xff08;2023-05&#xff09;-数据分析-排列组合-组合-C运算-至少-需反面思考真题&#xff08;2023-08&#xff09;-数据分析-排列组合-相邻不相邻-捆绑法插空法-插空法注意空位比座位多1个&#xff0c;是用A&#xff1b;捆绑法内部排序用A&#…

2023中国(海南)国际高尔夫旅游文化博览会 暨国际商界峰层·全球华人高尔夫精英巡回赛 全国颍商自贸港行盛大启幕

2023中国&#xff08;海南&#xff09;国际高尔夫旅游文化博览会&#xff08;以下简称“海高博”&#xff09;暨全国颍商走进海南自贸港于12月7-9日在海口观澜湖盛大开幕。该活动由中国国际贸易促进委员会海南省委员会、海南省旅游和文化广电体育厅主办&#xff0c;中国国际商会…

最新版本11.17的YOLOv8加入注意力方法

本文基于11.17版本,以往版本略有不同,可查看改进YOLOv8,教你YOLOv8如何添加20多种注意力机制进行参考 放入注意力代码,以biformer注意力为例 import torch import torch.nn as nn import torch.nn.functional as Fdef position(H, W, is_cuda=

探索 Python 中链表的实现:从基础到高级

# 更多资料获取 &#x1f4da; 个人网站&#xff1a;ipengtao.com 链表是一种基础的数据结构&#xff0c;它由一系列节点组成&#xff0c;每个节点都包含数据和指向下一个节点的引用。在Python中&#xff0c;可以使用类来实现链表&#xff0c;本文将介绍如何实现链表&#xff…

【密码学引论】认证

认证是许多应用系统中安全保护的第一道设防认证和加密的区别&#xff1a;加密用来确保数据的保密性&#xff0c;而认证用来确保报文发送者和接受者的真实性和报文的完整性。认证和数字签名的区别&#xff1a; 认证总是基于某种收发双方共享的保密数据来认证被鉴别对象的真实性&…

关于linux开机自启动

1、系统启动流程 2、 init、 inittab、 init.d、 rcx.d /etc/inittab是Linux系统中的一个配置文件&#xff0c;用于定义系统的运行级别和相应的操作。其语法格式如下&#xff1a; 标签&#xff1a;运行级别&#xff1a;操作&#xff1a;进程 label:runlevel:action:process下面…

PHP基础 - 注释变量

一. 语言开始标识 在PHP中,文件的开头需要使用语言开始标识来指定该文件是PHP代码。标识通常为"<?php",也可以是"<?",但建议使用"<?php"以确保代码的兼容性和可读性。 <?php // PHP代码从这里开始写 二. PHP注释 注释是用…

【Python】Faker库详解:创建测试数据轻而易举

Python Faker库详解&#xff1a;创建测试数据轻而易举 在软件开发和测试过程中&#xff0c;通常需要大量的测试数据来模拟真实环境。Python的Faker库为开发者提供了一个方便、灵活且强大的工具&#xff0c;用于生成各种虚构数据。本文将深入介绍Faker库&#xff0c;演示其基本…

十一、了解分布式计算

1、什么是&#xff08;数据&#xff09;计算&#xff1f; 2、分布式(数据)计算 &#xff08;1&#xff09;概念 顾名思义&#xff0c;分布式计算&#xff0c;即以分布式的形式完成数据的统计&#xff0c;得到需要的结果。 分布式数据计算&#xff0c;顾名思义&#xff0c;就是…