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

C++面向对象 继承

格式

class 子类:继承方式 父类
{};//子类  又称为派生类
//父类  又称为基类

三种继承方式 

继承中的同名成员处理

 继承中的同名静态成员处理

包含子对象的派生类构造函数

作用:

包含子对象的派生类构造函数用于在创建派生类对象时,不仅初始化派生类自身的数据成员,还能正确地初始化其基类子对象和子对象(即成员对象)

构造和析构顺序

  • 构造顺序:基类构造函数 -> 子对象构造函数 -> 派生类构造函数。
  1. 基类构造函数:由于派生类继承自基类,所以基类的构造函数会首先被调用,目的是初始化从基类继承来的成员变量。
  2. 子对象构造函数:在基类构造函数执行完毕后,派生类中包含的子对象的构造函数会依次被调用,以完成子对象的初始化。
  3. 派生类构造函数:最后,派生类自身的构造函数才会执行,对派生类特有的成员变量进行初始化。
  • 析构顺序:派生类析构函数 -> 子对象析构函数 -> 基类析构函数。

模板:

#include <iostream>
class Base 
{
public:Base() { std::cout << "基类调用" << std::endl; }
};class Member 
{
public:Member() { std::cout << "子对象调用" << std::endl; }
};class Derived : public Base 
{
public:Member member;Derived() { std::cout << "派生类调用" << std::endl; }
};int main() 
{Derived d;return 0;
}
//运行结果基类调用
子对象调用
派生类调用

例题1

#include <iostream>
#include <string>
using namespace std;
// 生日类
class BirthDate
{
public:int year;int month;int day;// 构造函数BirthDate(int y, int m, int d) : year(y), month(m), day(d) {}// 修改生日的函数void modifyBirthday(int y, int m, int d){year = y;month = m;day = d;}// 输出生日信息的函数void displayBirthday(){cout << "year:" << year << endl;cout << "month:" << month << endl;cout << "day:" << day << endl;}
};
// 教师类
class Teacher
{
public:int num;string name;char sex;BirthDate birth;//定义子对象// 构造函数Teacher(int n, string na, char se, int y, int m, int d) : num(n), name(na), sex(se), birth(y, m, d) {}
// 输出教师个人信息的函数void displayInfo(){cout << "num:" << num << endl;cout << "name:" << name << endl;cout << "sex:" << sex << endl;birth.displayBirthday();}// 修改教师生日的函数void modifyTeacherBirthday(int y, int m, int d){birth.modifyBirthday(y, m, d);}
};
int main()
{// 定义 Teacher 类对象 tea1 并给出所有数据的初值Teacher tea1(101, "张三", 'm', 1973, 4, 17);// 输出教师的初始信息tea1.displayInfo();// 修改 tea1 的生日数据tea1.modifyTeacherBirthday(1586, 5, 25);// 输出教师修改后的信息tea1.displayInfo();return 0;
}

例题2 

#include<iostream>
#include<string>
using namespace std;
class Person
{string name;char sex;int age;
public:Person(string na,char se,int ag):name(na),sex(se),age(ag){}void IntroduceMe(){string s=(sex=='M'?"Male":"Female");cout<<"My name is"<<name<<", "<<s<<", "<<age<<"years old."<<endl;}void Eat(){cout<<"I'm hungry! I'd like something to eat! "<<endl;}void Rest(){cout<<"I'm tired. I need to rest."<<endl;}
};
class Student:public Person
{string num;string zhuanye;
public:Student(string na,char se,int ag,string nu,string zy):Person(na,se,ag),num(nu),zhuanye(zy){cout<<"我的学号是"<<num<<"专业是"<<zhuanye<<endl;}void shangke(){cout<<"我正在上课"<<endl;}void kaoshi(){cout<<"我正在考试"<<endl;}
};
int main()
{Person p1("张三",'M',19);p1.IntroduceMe();p1.Eat();p1.Rest();cout<<"---------------------------------------"<<endl;Student s2("李四",'M',18,"201210101","计算机");s2.Eat();s2.Rest();s2.IntroduceMe();s2.shangke();s2.kaoshi();return 0;
}

多继承语法

作用:允许一个类继承多个类

语法:class 子类:继承方式 父类1,继承方式 父类2...

如果在多继承中引发同名成员出现,需要加作用于区分

http://www.xdnf.cn/news/4547.html

相关文章:

  • c语法高阶—(联合体,枚举,位域,编译器,宏定义,条件编译,条件编译,头文件)
  • 代码随想录第36天:动态规划9(序列问题)
  • EDU/EDU.CN教育邮箱的申请(申请成功可以免费使用一年CursorPro)
  • Ubuntu 安装 Keepalived、LVS
  • 【无标题】MPC软件
  • 第七章----输入输出模板
  • 软考中级软件设计师——UML(统一建模语言)篇
  • 手机端调试工具 eruda 使用方法
  • vue3自定义audio音频播放【进度条,快进,后退,音量加减,播放速度】
  • 【面试 · 一】vue大集合
  • 追踪大型语言模型的思想(下)(来自针对Claude的分析)
  • 积累知识 11.1
  • Clojure 学习笔记
  • sunset: dawn靶场渗透
  • 在shell中运行RDD程序
  • 航电系统之网络控制技术篇
  • 罗氏线圈抗干扰特性测试方法研究
  • 卷积神经网络基础(七)
  • 使用Java NIO 实现一个socket通信框架
  • MSTP 实验拓扑配置
  • 生产管理是啥?生产计划该怎么做?
  • 黄金分割法(0.618 法)
  • 机器学习实战:6种数据集划分方法详解与代码实现
  • 微粉助手 1.1.0 | 专为社交电商用户设计的一站式营销工具,集成了群发消息、智能加好友、清理僵尸粉等功能
  • FBRT-YOLO:面向实时航空图像检测的更快更好的YOLO变体解析
  • AcWing 递归实现组合型枚举
  • 性能比拼: Redis Streams vs Pub/Sub
  • 电池全自动生产线:驱动新能源产业升级的核心引擎
  • 华为安全认证好还是数通认证好?
  • Excel表格批量合并工具推荐