目录

  • 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++中,访问修饰符publicprotectedprivate用于控制类的成员的访问权限。其中,public成员可以被类的外部访问,protected成员可以被类的子类访问,private成员只能被类的内部访问。

构造函数和析构函数

子类的构造函数可以调用父类的构造函数来初始化父类的成员变量。调用父类构造函数的语法格式如下:

ChildClass::ChildClass(int a, int b, int c) : ParentClass(a, b){// 初始化子类的成员变量this->c = c;
}

其中,ChildClass是子类的名称,ParentClass是父类的名称,ab是父类的成员变量,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;
}

以上代码定义了三个类 ShapeRectangleSquareRectangleSquare 类继承了 Shape 类的属性和方法,并添加了自己的方法 getArea。在 main 函数中,创建了 Rectangle 对象 RectSquare 对象 Sq,并调用了它们的方法 getArea

参考资料

  • C++ 类的继承和派生
  • C++ 虚函数和纯虚函数
  • C++ 多重继承

【C++进阶知识】C++类的继承和派生相关推荐

  1. 模块的封装之C语言类的继承和派生

    [交流][微知识]模块的封装(二):C语言的继承和派生 在模块的封装(一):C语言的封装中,我们介绍了如何使用C语言的结构体来实现一个类的封装,并通过掩码结构体的方式实 现了类成员的保护.这一部分,我 ...

  2. 实验四 类和对象;类的继承和派生;多态性; 接口;构造器应用

    实验四 类和对象:类的继承和派生:多态性: 接口:构造器应用 一.实验目的 1. 掌握类与对象的关系: 2. 掌握类的定义: 3. 掌握对象的声明及使用: 4. 掌握构造方法的概念及调用时机: 5. ...

  3. 类的继承和派生java_类的继承和派生

    一.类的继承和派生定义. 继承:保持已有类的特性而构造新类的过程称为继承. 派生:在已有类的基础上新增自己的特性而产生新类的过程称为派生. 被继承的已有类称为基类. 派生出的新类称为派生类. 二.继承 ...

  4. C++类的继承与派生

    文章目录 一.继承 二.基类和派生类 三.继承方式 六.多继承 七.应用经验 八.课后作业 九.版权声明 一.继承 继承是面向对象程序设计中最重要的一个概念.继承允许我们根据一个类来定义另一个类,达到 ...

  5. C++语言类的继承与派生介绍和示例

    继承 继承是面向对象程序设计中最重要的一个概念.继承允许我们根据一个类来定义另一个类,达到了代码功能重用效果. 当创建一个类时,如果待创建的类与另一个类存在某些共同特征,程序员不需要全部重新编写成员变 ...

  6. python 钻石继承_python3--object类,继承与派生,super方法,钻石继承问题

    python3--object类,继承与派生,super方法,钻石继承问题 发布时间:2018-04-13 20:38:05编辑:Run阅读(1914) 昨天内容复习 组合:什么有什么的关系(例:老师 ...

  7. 【廖雪峰python进阶笔记】类的继承

    1. 继承 如果已经定义了Person类,需要定义新的Student和Teacher类时,可以直接从Person类继承: class Person(object):def __init__(self, ...

  8. C++基础知识整理十(继承和派生 公有派生类 私有派生类 保护派生类)

    1,继承和派生 CPeople.cpp代码如下 #include "pch.h" #include "CPeople.h" #include <iostr ...

  9. 头歌Educoder实验:C++ 面向对象 - 类的继承与派生

    第1关:公有继承 -- 学生信息类 任务描述 本关任务:采用公有继承设计学生信息类. 相关知识 继承 继承是使代码可以复用的重要手段,也是面向对象程序设计的核心思想之一.简单的说,继承是指一个对象直接 ...

最新文章

  1. 阿里BCG重磅报告《人工智能,未来致胜之道》
  2. buu [BJDCTF 2nd]rsa0
  3. Shadow Mapping 的原理与实践 【转】
  4. ITK:重视Valued图像的区域最小值
  5. php论坛有哪些_建网站的软件哪个好?建网站的软件有哪些?
  6. java 自带导出excel_4.java项目页面导出excel功能
  7. 函数类型:有参函数、无参函数、匿名函数、回调函数、立即执行函数、闭包函数、递归函数...
  8. JAVA中File转MultiparFile
  9. 财务有必要学python吗-财务人要学Python吗?
  10. ClassNotFoundException和NoClassDefError之间的区别
  11. jsp 九大内置对象详解以及示例
  12. arduino+无源蜂鸣器制作音乐《诺言》(实战篇)——从识读简乐谱到程序编写
  13. Proteus的使用总结
  14. SpringCloud入门之项目实例
  15. 优质短视频内容有哪些特质?不要迷信爆款,通俗易懂很重要
  16. 安费诺面试经验(已面试,等通知)
  17. 你会使用Excel中的【照相机】吗?
  18. Call From hadoop102/192.168.10.102 to hadoop102:8020 failed on connection exception: java.net.Connec
  19. [概念] 敏感性分析(Sensitivity Analysis) 和龙卷风图(tornado diagram)
  20. 具有立体效果的地图制作

热门文章

  1. 用平面图片制作3D模型【3DsMax】
  2. 我的世界梦之边缘5服务器在维护吗,我的世界梦之边缘V 第一个包含动漫CG剧情的RPG服务器...
  3. 电脑的“应用与浏览器控制”出现黄色感叹号
  4. 【电气专业知识问答】问:什么叫组合电器?什么是GIS?
  5. Android和OpenCV的学习mat运算/颜色转换
  6. jsp提交判空/jsp重置
  7. 学习 Python Django
  8. 进入中国内地第31年的麦当劳 ,为什么还能不断吸引新消费人群?
  9. 使用jq简单实现导航栏切换对应展现内容
  10. STM32 WinUSB(WCID)免驱高速通信 20M/s(附详细测试)