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

【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++中,访问修饰符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++ 多重继承

http://www.kler.cn/a/15005.html

相关文章:

  • Linux入门操作
  • 【Python】ddddoc进行OCR识别和目标检测 ——识别验证码和滑块(安装部署+测试代码注释详细)
  • Next.js 备忘清单_开发速查表分享
  • 1970-01-01是什么?为什么计算机起始时间是1970年1月1日
  • 使用SOCK_DGRAM类型的socket实现的ping程序
  • 高效的封装一个网络请求需要考虑哪些?
  • 服务(第十三篇)lvs(负载均衡器)+nginx(反向代理)+tomcat(后端服务器)+nfs共享
  • Spring————java的反射机制,Spring的IOC和DI
  • ipv6地址技术详解
  • python@面向对象OOP@类的构造
  • 史上最烂 spring aop 原理分析
  • getType() 和 getGenericType()的区别
  • 细数Java集合List的10个坑
  • vue2、vue3实现暗黑模式
  • pikachu靶场-RCE
  • Linux运维:推荐八款Linux远程连接工具
  • MongoDB 数据库数据导入 - 关于如何使用 csv 导入数据的命令方法、图形界面可视化导入方法
  • 从训练数据视角:看机器学习和深度学习的大三范式
  • 太为难我了,阿里面试了7轮...
  • python内置数据结构常见操作易错总结[更新ing...]