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

c++--面向对象特性

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

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

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

#include <iostream> class Base { public: Base() { fun(); } 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; }


2.3. 注意点
多态针对类外部使用基类指针或基类引用调用基类虚函数时会发生。
多态针对基类内部调用虚函数,在隐式的this此时关联到派生实例时也会发生。
值得注意的是:在基类的构造函数中,this永远都关联到基类自身.只有在基类的非构造函数中,this才有可能被关联到派生类实例并引发多态访问.

#include <iostream> class Base { public: Base() { fun(); } 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&protect printf("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&protect printf("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&protect printf("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&protect A1 b(1, 2, 3); printf("pub_%d,pro_%d,pri_%d\n", b.m_pub, b.m_pro); } void friend_funA2() { // 友元的内部--对基类,保护基类的public&protect A2 b(1, 2, 3); printf("pub_%d,pro_%d,pri_%d\n", b.m_pub, b.m_pro); } void friend_funA3() { // 友元的内部----对基类,私有基类的public&protect A3 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.jsqmd.com/news/1321928/

相关文章:

  • 手腕上的小手电:智能手表怎么把“绿光”变成心率
  • Unity串口通信实战:多线程安全读写与设备状态监控架构解析
  • 公证赠与怎么办理?办理公证赠与需要准备哪些资料?
  • 炉石传说脚本终极指南:3步实现智能挂机与卡组自动化测试
  • FusionCompute管理员密码丢失?后台数据库安全重置全攻略
  • 解锁Photoshop的WebP格式能力:WebPShop插件完全指南
  • 基于对话本体论的碳硅文明算符形式化模型构建方法与路径
  • Ecctrl时间控制功能:实现子弹时间与慢动作效果的完整教程
  • 上海本土SEO/GEO优化公司哪家好?靠谱服务商推荐附避坑指南 - 知汇资讯
  • 企业信用评级机构哪家好?2026年线上申请流程详解 - 跑政通
  • C++之try,throw,catch探究
  • 为什么你的AI产品图过不了平台审核?版权/光影/比例3大雷区,今天必须解决!
  • Palworld存档转换神器:3分钟掌握.sav与JSON互转技巧
  • NoSleep防休眠工具:Windows电脑永不锁屏的终极解决方案
  • 下一代无头浏览器革命:Lightpanda如何重新定义Web自动化性能极限
  • 基于Home Assistant与ESP8266打造本地化智能家庭影院控制方案
  • 为什么选择fb-mac-messenger:5个提升Mac聊天体验的专业理由
  • Windows系统OpenJDK安装配置全攻略:从发行版选择到多版本管理
  • 2026年最新上海静安靠谱装修公司推荐榜:甄选本土优质好店,装企实战避坑指南 - 优客装修汇
  • Pandas 基础操作(案持续更新)
  • 流量分析实战:从基础认知到高级技战法
  • 通达信、东方财富神奇九转指标计算公式,代码实现
  • 3分钟快速上手:Forza Mods AIO免费极限竞速地平线修改器终极指南
  • 自指度量g^ℛ = g₀ + α·ℛ的正定性与良定义性:理论框架与严格证明报告
  • 2026常州管道疏通哪家好旭日管道疏通免费上门靠谱 - 余生黄金回收
  • 2026实测教程:视频没有字幕也能转文字吗 免费可用方法 - 效率工具研究所
  • 如何快速入门信息检索?TU Wien开源课程的5大核心模块解析
  • 塞尔达传说旷野之息存档编辑器终极指南:三步掌握游戏修改自由
  • Steam游戏自动破解神器:终极免Steam客户端启动完整指南
  • P5736 【深基7.例2】质数筛