【C++进阶知识】C++类的继承和派生
目录
- C++进阶知识系列文章
- C++类的继承和派生
- 基本语法
- 访问修饰符
- 构造函数和析构函数
- 覆盖父类的方法
- 虚函数和纯虚函数
- 示例代码
- 参考资料
C++进阶知识系列文章
C++类的继承和派生
在面向对象编程中,继承是一种实现代码复用的方法。在C++中,类可以从另一个类继承属性和方法,被继承的类称为父类或基类,继承的类称为子类或派生类。通过继承,子类可以获得父类的所有公有成员,包括属性和方法,并且可以在此基础上添加自己的属性和方法。
基本语法
类的继承和派生的语法格式如下:
class ChildClass : public ParentClass{// ChildClass 继承 ParentClass 的所有属性和方法
};
其中,ChildClass
是子类的名称,ParentClass
是父类的名称。public
是访问修饰符,表示子类可以访问父类的公有成员。C++支持多重继承,即一个子类可以继承多个父类。语法格式如下:
class ChildClass : public ParentClass1, public ParentClass2{// ChildClass 继承 ParentClass1 和 ParentClass2 的所有属性和方法
};
访问修饰符
在C++中,访问修饰符public
、protected
和private
用于控制类的成员的访问权限。其中,public
成员可以被类的外部访问,protected
成员可以被类的子类访问,private
成员只能被类的内部访问。
构造函数和析构函数
子类的构造函数可以调用父类的构造函数来初始化父类的成员变量。调用父类构造函数的语法格式如下:
ChildClass::ChildClass(int a, int b, int c) : ParentClass(a, b){// 初始化子类的成员变量this->c = c;
}
其中,ChildClass
是子类的名称,ParentClass
是父类的名称,a
和b
是父类的成员变量,c
是子类的成员变量。如果子类没有显式调用父类的构造函数,编译器会自动调用父类的默认构造函数。
子类的析构函数也可以调用父类的析构函数来释放父类的资源,语法格式如下:
ChildClass::~ChildClass(){// 释放子类的资源
}
覆盖父类的方法
在子类中,可以覆盖父类的方法,以实现自己的功能。覆盖父类的方法的语法格式如下:
void ChildClass::print(){// 子类自己的实现
}
其中,ChildClass
是子类的名称,print
是覆盖的方法名。如果子类没有覆盖父类的方法,子类会继承父类的方法。
虚函数和纯虚函数
在C++中,虚函数是一种特殊的成员函数,它可以被子类覆盖。在父类中声明一个虚函数,可以使子类在覆盖该函数时保持相同的函数签名。语法格式如下:
class ParentClass{public:virtual void print(){cout << "This is ParentClass" << endl;}
};
在子类中覆盖父类的虚函数,可以使用override
关键字显式声明。语法格式如下:
class ChildClass : public ParentClass{public:void print() override{cout << "This is ChildClass" << endl;}
};
纯虚函数是一种没有实现的虚函数,它在父类中声明,但是没有函数体。纯虚函数可以用来实现接口,即父类只声明接口,子类负责实现接口。语法格式如下:
class ParentClass{public:virtual void print() = 0;
};
示例代码
#include <iostream>
using namespace std;class Shape{public:void setWidth(int w){width = w;}void setHeight(int h){height = h;}
protected:int width;int height;
};class Rectangle: public Shape{public:int getArea(){return (width * height);}
};class Square: public Shape{public:int getArea(){return (width * width);}
};int main(){Rectangle Rect;Rect.setWidth(5);Rect.setHeight(7);cout << "Rect Area: " << Rect.getArea() << endl;Square Sq;Sq.setWidth(5);cout << "Sq Area: " << Sq.getArea() << endl;return 0;
}
以上代码定义了三个类 Shape
、Rectangle
和 Square
,Rectangle
和 Square
类继承了 Shape
类的属性和方法,并添加了自己的方法 getArea
。在 main
函数中,创建了 Rectangle
对象 Rect
和 Square
对象 Sq
,并调用了它们的方法 getArea
。
参考资料
- C++ 类的继承和派生
- C++ 虚函数和纯虚函数
- C++ 多重继承
【C++进阶知识】C++类的继承和派生相关推荐
- 模块的封装之C语言类的继承和派生
[交流][微知识]模块的封装(二):C语言的继承和派生 在模块的封装(一):C语言的封装中,我们介绍了如何使用C语言的结构体来实现一个类的封装,并通过掩码结构体的方式实 现了类成员的保护.这一部分,我 ...
- 实验四 类和对象;类的继承和派生;多态性; 接口;构造器应用
实验四 类和对象:类的继承和派生:多态性: 接口:构造器应用 一.实验目的 1. 掌握类与对象的关系: 2. 掌握类的定义: 3. 掌握对象的声明及使用: 4. 掌握构造方法的概念及调用时机: 5. ...
- 类的继承和派生java_类的继承和派生
一.类的继承和派生定义. 继承:保持已有类的特性而构造新类的过程称为继承. 派生:在已有类的基础上新增自己的特性而产生新类的过程称为派生. 被继承的已有类称为基类. 派生出的新类称为派生类. 二.继承 ...
- C++类的继承与派生
文章目录 一.继承 二.基类和派生类 三.继承方式 六.多继承 七.应用经验 八.课后作业 九.版权声明 一.继承 继承是面向对象程序设计中最重要的一个概念.继承允许我们根据一个类来定义另一个类,达到 ...
- C++语言类的继承与派生介绍和示例
继承 继承是面向对象程序设计中最重要的一个概念.继承允许我们根据一个类来定义另一个类,达到了代码功能重用效果. 当创建一个类时,如果待创建的类与另一个类存在某些共同特征,程序员不需要全部重新编写成员变 ...
- python 钻石继承_python3--object类,继承与派生,super方法,钻石继承问题
python3--object类,继承与派生,super方法,钻石继承问题 发布时间:2018-04-13 20:38:05编辑:Run阅读(1914) 昨天内容复习 组合:什么有什么的关系(例:老师 ...
- 【廖雪峰python进阶笔记】类的继承
1. 继承 如果已经定义了Person类,需要定义新的Student和Teacher类时,可以直接从Person类继承: class Person(object):def __init__(self, ...
- C++基础知识整理十(继承和派生 公有派生类 私有派生类 保护派生类)
1,继承和派生 CPeople.cpp代码如下 #include "pch.h" #include "CPeople.h" #include <iostr ...
- 头歌Educoder实验:C++ 面向对象 - 类的继承与派生
第1关:公有继承 -- 学生信息类 任务描述 本关任务:采用公有继承设计学生信息类. 相关知识 继承 继承是使代码可以复用的重要手段,也是面向对象程序设计的核心思想之一.简单的说,继承是指一个对象直接 ...
最新文章
- 阿里BCG重磅报告《人工智能,未来致胜之道》
- buu [BJDCTF 2nd]rsa0
- Shadow Mapping 的原理与实践 【转】
- ITK:重视Valued图像的区域最小值
- php论坛有哪些_建网站的软件哪个好?建网站的软件有哪些?
- java 自带导出excel_4.java项目页面导出excel功能
- 函数类型:有参函数、无参函数、匿名函数、回调函数、立即执行函数、闭包函数、递归函数...
- JAVA中File转MultiparFile
- 财务有必要学python吗-财务人要学Python吗?
- ClassNotFoundException和NoClassDefError之间的区别
- jsp 九大内置对象详解以及示例
- arduino+无源蜂鸣器制作音乐《诺言》(实战篇)——从识读简乐谱到程序编写
- Proteus的使用总结
- SpringCloud入门之项目实例
- 优质短视频内容有哪些特质?不要迷信爆款,通俗易懂很重要
- 安费诺面试经验(已面试,等通知)
- 你会使用Excel中的【照相机】吗?
- Call From hadoop102/192.168.10.102 to hadoop102:8020 failed on connection exception: java.net.Connec
- [概念] 敏感性分析(Sensitivity Analysis) 和龙卷风图(tornado diagram)
- 具有立体效果的地图制作
热门文章
- 用平面图片制作3D模型【3DsMax】
- 我的世界梦之边缘5服务器在维护吗,我的世界梦之边缘V 第一个包含动漫CG剧情的RPG服务器...
- 电脑的“应用与浏览器控制”出现黄色感叹号
- 【电气专业知识问答】问:什么叫组合电器?什么是GIS?
- Android和OpenCV的学习mat运算/颜色转换
- jsp提交判空/jsp重置
- 学习 Python Django
- 进入中国内地第31年的麦当劳 ,为什么还能不断吸引新消费人群?
- 使用jq简单实现导航栏切换对应展现内容
- STM32 WinUSB(WCID)免驱高速通信 20M/s(附详细测试)