C++进阶(三) : 封装【详解】
2022/2/10 20:22:10
本文主要是介绍C++进阶(三) : 封装【详解】,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
封装作为C++的三大特征之一(其余两个为继承和多态),其实现依赖于它的访问权限控制,关键字public,protected,private的其权限说明如下:
- public:类内及类外均可使用,是类对外连接的接口。
- protected:类内可访问,友元函数可访问,子类也可访问,类外不可访问。
- private:只有类内及友元函数可访问。
在子类继承父类成员变量时,根据继承的方式不同,继承后的父类权限也会不同,但无论何种继承方式,子类访问不了父类的private成员:
- public:父类public及protected成员的访问权限类型不变
- protected:父类的public及protected成员均变为protected权限
- private:父类的public及protected成员均变为private权限
有一点需要注意的是,在protect或private继承时,未进行显式类型转换的子类指针或引用无法赋值给父类指针或引用。例如:
#include<iostream> using namespace std; /* 水果抽象类 */ class Fruit { public: virtual void say() { cout << "我是水果..." << endl; } virtual void getName() { cout << "我是香蕉..." << endl; } }; /* 香蕉具体类 */ class Banana :private Fruit { public: virtual void getName() { cout << "我是香蕉..." << endl; } }; int main() { Fruit* banana = new Banana(); banana->getName(); return 0; }
此时编译代码会报错,提示无法将子类Banana转换为父类Fruit:
拓展
当子类使用protected或private继承父类时,其父类的方法在子类对象中都将变成对外不可见,我们有什么方法,可以在外部直接访问到父类的这些方法呢?
(1)通过新建一个public权限的子类成员函数,对父类的某个方法进行一层包装,这样当外部调用子类的这个方法时,实际调用的就是父类的方法。
(2)那就是使用using关键字。将继承来的方法,在子类的public范围内,进行using声明,这样,外部就可以直接使用了。例如:
#include<iostream> using namespace std; /* 水果抽象类 */ class Fruit { public: virtual void say() { cout << "我是水果..." << endl; } virtual void getName() { cout << "我是香蕉..." << endl; } }; /* 香蕉具体类 */ class Banana :protected Fruit { public: using Fruit::say; virtual void getName() { cout << "我是香蕉..." << endl; } }; int main() { Banana* banana = new Banana(); banana->say(); return 0; }
很明显,using声明只使用成员名称,没有圆括号,没有返回值,没有参数。
这篇关于C++进阶(三) : 封装【详解】的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-05-13PingCAP 戴涛:构建面向未来的金融核心系统
- 2024-05-09flutter3.x_macos桌面os实战
- 2024-05-09Rust中的并发性:Sync 和 Send Traits
- 2024-05-08使用Ollama和OpenWebUI在CPU上玩转Meta Llama3-8B
- 2024-05-08完工标准(DoD)与验收条件(AC)究竟有什么不同?
- 2024-05-084万 star 的 NocoDB 在 sealos 上一键起,轻松把数据库编程智能表格
- 2024-05-08Mac 版Stable Diffusion WebUI的安装
- 2024-05-08解锁CodeGeeX智能问答中3项独有的隐藏技能
- 2024-05-08RAG算法优化+新增代码仓库支持,CodeGeeX的@repo功能效果提升
- 2024-05-08代码报错不用愁,CodeGeeX一键完成代码修复、错误解释的功能上线了!