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

C++】面向对象编程:继承与多态的魅力

继承的概念

继承机制是面向对象程序设计使代码可以复用的重要手段。它允许我们在原有类的特性的基础上进行扩展,增加方法和属性,这样产生新的类,称派生类。

继承的定义

代码语言:javascript

AI代码解释

//class 派生类名 :继承方式 基类名 class Person { //.... }; class Studen:public Person//定义继承 { //... }; ************************************************************* #include<iostream> #include<string> using namespace std; class Person { public: protected: string _name; string _address; int _age=18; string _tel; }; class teacher:public Person { public: void identity() { cout << "teacher:" << "void identity()" << endl; } protected: string _title; }; class student:public Person { public: void identity() { cout << "student:" << "void identity()" << endl; } protected: int _stuid; }; int main() { student s; teacher t; s.identity(); t.identity(); return 0; }

继承的方式(与访问限定符很像)

  1. public继承
  2. protected继承
  3. private继承
继承基类(父类)成员访问方式的变化

基类private成员在派⽣类中无论以什么方式继承都是不可见的。

基类private成员在派⽣类中是不能被访问,如果基类成员不想在类外直接被访问,但需要在派⽣类中能访问,就定义为protected。

实际上⾯的表格我们进行⼀下总结会发现,基类的私有成员在派⽣类都是不可见。基类的其他成员 在派生类的访问方式==Min(成员在基类的访问限定符,继承⽅式),public >protected> private。

使⽤关键字class时默认的继承方式是private,使⽤struct时默认的继承方式是public,不过最好显示的写出继承方式。

在实际运⽤中⼀般使⽤都是public继承,⼏乎很少使用protetced/private继承,也不提倡使用 protetced/private继承,因为protetced/private继承下来的成员都只能在派生类的类里面使用,实际中扩展维护性不强。

继承类模板

代码语言:javascript

AI代码解释

namespace liu { //template<class T> //class vector //{}; // stack和vector的关系,既符合is - a,也符合has - a template<class T> class stack : public std::vector<T> { public: void push(const T& x) { // 基类是类模板时,需要指定⼀下类域, // 否则编译报错: error C3861 : “push_back”:找不到标识符 // 因为stack<int>实例化时,也实例化vector<int>了 // 但是模版是按需实例化,push_back等成员函数未实例化,所以找不到 //push_back(x); vector<T>::push_back(x); //push_back(x); } void pop() { vector<T>::pop_back(); } const T& top() { return vector<T>::back(); } bool empty() { return vector<T>::empty(); } }; } template<class Container> void Print(const Container& c) { //这里需要注意,因为这里是模板,所以需要在Container前面加typename。 //因为这是一个模板,Container是模板参数,编译器不知道Container是什么类型,它可能是一个内嵌类型,也可能是一个静态成员变量,因此,我们需要在前面加上一个typename告诉编译器Container是一个类型, typename Container::const_iterator it1=c.begin(); while(it1!=c.end()) { cout<<*it1<<endl; ++it1; } cout<<endl; } int main() { return 0; }
基类与派生类间的转换
  • public继承的派⽣类对象可以赋值给基类的指针/基类的引用。这⾥有个形象的说法叫切片或者切割。寓意把派生 类中基类那部分切出来,基类指针或引⽤指向的是派⽣类中切出来的基类那部分
  • 基类对象不能赋值给派生类对象。
  • 基类的指针或者引用可以通过强制类型转换赋值给派⽣类的指针或者引用。但是必须是基类的指针 是指向派生类对象时才是安全的。这里基类如果是多态类型,可以使用RTTI(Run-TimeType Information)的dynamic_cast 来进⾏识别后进行安全转换。(ps:这个我们后面类型转换章节再单独专门讲解,这里先提一下
http://www.jsqmd.com/news/478952/

相关文章:

  • Embedding和向量数据库
  • 深入剖析C++文件操作的底层机制
  • 字符串反转和统计字符串中字符类型及频次
  • [特殊字符] 龍魂系统执行日志|2026-03-13|底层宪法数据库落地·30天最后宣言·打破的根在道统不在霸权
  • 精准删除:掌握SQL中的DELETE语句
  • OmoFun 1.1.4 | 追番神器官方APP下载.官网入口
  • Python 数据结构示例
  • Tensflow学习第T1周打卡
  • test_1_2026
  • 基于单片机的蔬菜大棚数据采集系统的设计
  • 【day52】
  • 端侧AI 的定义与发展背景
  • 03.SpringAI 使用FunctionCalling实现智能客服
  • 基于单片机的土壤墒情监测系统的设计与实现
  • OpenClaw技术架构深度解析:原理、核心与源码全面解读
  • 2026年3月口碑好的压电式传感器厂家推荐TOP - 品牌推荐用户报道者
  • 【亲测】2026年OpenClaw(Clawdbot)零技术点几下秒级安装教程
  • 看不见的飓风:电动汽车如何重塑全球经济版图
  • 不平衡电网电压下 VSG 如何控制三相电流平衡
  • 【2026年最新600套毕设项目分享】springboot“校园淘”二手交易平台(14127)
  • 【2026年最新600套毕设项目分享】springboot数字博物馆系统(14128)
  • AI写论文必备,精选4款AI论文生成工具搞定各类学术论文!
  • 从硬件抽象到意图对齐:论 AI 时代操作系统演进的逻辑必然与 OpenClaw 的范式价值
  • 2026年高校AI率标准汇总:本科30%硕士15%博士10%怎么达标 - 还在做实验的师兄
  • 【调试心法】撕烂 printf 的虚伪面具!消灭“海森堡 Bug”,用 C++ 构建零开销的异步日志引擎 (Async Logger)
  • 【2026年最新600套毕设项目分享】基于SpringBoot的电力集团职称评定系统(14129)
  • 嘎嘎降AI双引擎到底是什么?和普通降AI工具有啥区别 - 还在做实验的师兄
  • 精通类器官培养
  • OpenClaw,如果我想让它帮我盯盘或抢购,该怎么设置?
  • 2026嘎嘎降AI实测:知网AIGC检测4.0算法下还能稳过吗? - 还在做实验的师兄