9.2 抽象类定义、子类是抽象类

这篇博客探讨了Java中的抽象类定义,强调了含有抽象方法的类必须声明为抽象类。内容包括抽象方法的特点,如无方法主体,并且抽象类不能直接实例化。子类继承抽象类时,必须重写所有抽象方法,除非子类自身也是抽象类。博客还提供了发红包的案例,包括抽象父类User、群组类和群成员类的实现,以及测试结果。
摘要由CSDN通过智能技术生成

想了解更多请查看java学习(idea版)

目录

抽象类定义

列:抽象类练习

列:当子类是抽象类时

列:发红包案例


抽象类定义

  1.  没有方法主体的方法称为抽象方法
  2. Java语法规定,包含抽象方法的类一定是抽象类,在class之前写上abstract即可

如何使用抽象类和抽象方法:

  • 1. 不能直接创建new抽象类对象。必须用一个子类来继承抽象父类
  • 2. 抽象类中可以有抽象方法和成员方法、构造方法,抽象方法没有方法体
  • 3. 子类必须覆盖重写抽象父类当中所有的抽象方法。(当子类是抽象类时,抽象的父类可以选择性覆盖重写抽象方法)
  • 4 . 抽象类的子类,必须重写抽象父类中所有的抽象方法,否则,编译无法通过而报错。除非该子类也是抽象类。
一个抽象类不一定含有抽象方法,只要保证抽象方法所在的类是抽象类即可。

列:抽象类练习

 

## 9 类与对象 ### 9.1 类的定义 **前言** > 本章将带领大家深入了解面向对象编程(OOP)的核心概念——类(class)。类是C++中的一种用户自定义的数据类型,它封装了数据成员和成员函数,实现了数据抽象和信息隐藏。通过类的定义,我们可以创建出具有相同属性和行为的对象实例,从而构建出更加模块化、易于维护的程序。 ### 9.1.1 类的定义语法 在C++中,类的定义使用关键字`class`,一般格式如下: ```cpp class ClassName { private: // 私有成员,默认也是私有的 // 私有数据成员 public: // 公共成员 // 构造函数 ClassName(); // 成员函数 void memberFunction(); }; // 构造函数定义 ClassName::ClassName() { // 构造函数体 } // 成员函数定义 void ClassName::memberFunction() { // 成员函数体 } ``` ### 9.1.2 类的组成要素 1. **数据成员(Data Members)**:用于保存对象的状态信息,可以是任意合法的数据类型,如基本类型、指针、引用或其他类的对象等。根据访问权限的不同,可分为公有(public)、私有(private)和受保护(protected)三种。 2. **成员函数(Member Functions)**:也叫方法(Method),用于定义对象的行为。同样可以根据访问权限分为公有、私有和受保护三种。 3. **构造函数(Constructor)**:特殊的成员函数,主要用于初始化对象。它与类同名且没有返回值类型(即使是`void`也不行)。每当创建一个新的对象时,都会自动调用对应的构造函数。 4. **析构函数(Destructor)**:当对象生命周期结束时自动调用,负责清理工作,如释放资源等。析构函数的名字是在类名前加上波浪号`~`。 ### 9.1.3 示例代码 下面我们来看一个具体的例子,展示如何定义一个简单的类并创建其对象。 ```cpp #include <iostream> using namespace std; class Point { private: int x, y; public: // 默认构造函数 Point() : x(0), y(0) {} // 带参数的构造函数 Point(int posX, int posY) : x(posX), y(posY) {} // 获取坐标X值 int getX() const { return x; } // 设置坐标X值 void setX(int newX) { x = newX; } // 获取坐标Y值 int getY() const { return y; } // 设置坐标Y值 void setY(int newY) { y = newY; } // 显示坐标信息 void showPoint() const { cout << "(" << x << "," << y << ")" << endl; } }; int main() { // 创建Point类的第一个对象p1 Point p1; p1.showPoint(); // 输出:(0,0) // 创建Point类的第二个对象p2,并初始化 Point p2(3, 4); p2.showPoint(); // 输出:(3,4) // 修改p2的位置 p2.setX(5); p2.setY(6); p2.showPoint(); // 输出:(5,6) return 0; } ``` ### 9.2 对象的创建与使用 **前言** > 上一小节我们学会了如何定义一个类,接下来要探讨如何基于这个类创建具体的对象实例,并对其进行操作。 ### 9.2.1 对象的创建 创建对象有两种方式:一种是在栈(stack)上创建局部对象,另一种是在堆(heap)上创建动态对象。前者由系统自动管理生命周期,后者则需要程序员显式地申请和释放内存。 ```cpp // 栈上创建对象 Point pointOnStack; // 堆上创建对象 Point* pointOnHeap = new Point(); delete pointOnHeap; // 记得删除以防止内存泄漏 ``` ### 9.2.2 对象的操作 一旦创建了对象,就可以通过点`.`或箭头`->`操作符访问其公有成员(如果是通过指针访问的话)。 ```cpp pointOnStack.setX(7); pointOnStack.showPoint(); (*pointOnHeap).setY(8); // 或者写作 pointOnHeap->setY(8); pointOnHeap->showPoint(); ``` ### 9.2.3 静态成员 有时候我们希望某个数据成员或成员函数在整个类范围内共享,而不是针对每一个单独的对象实例。这时可以使用静态成员(static members)。静态数据成员属于整个类而非某一特定对象,因此在所有对象间共享相同的副本;静态成员函数也只能访问静态数据成员和其他静态成员函数。 ```cpp class Counter { private: static int count; // 静态数据成员 public: Counter() { ++count; } static int getCount() { return count; } }; // 初始化静态数据成员 int Counter::count = 0; int main() { cout << "Initial Count: " << Counter::getCount() << endl; Counter obj1, obj2, obj3; cout << "Current Count: " << Counter::getCount() << endl; return 0; } ``` ### 9.3 类的继承与派生 **前言** > 继承(Inheritance)是面向对象编程中的一个重要特性,它允许一个类从另一个现有类那里继承属性和行为,形成父子关系。子类不仅可以拥有父类的一切特性,还能够扩展自己的独特之处。这种机制极大地提高了代码的复用率,降低了冗余度。 ### 9.3.1 单继承 最简单的继承形式是单继承(Single Inheritance),即一个子类仅继承自一个基类(Base Class)。 ```cpp class Animal { public: virtual void speak() const { cout << "Animal sound..." << endl; } }; class Dog : public Animal { // 子类Dog继承自父类Animal public: void speak() const override { cout << "Woof!" << endl; } }; int main() { Animal animal; Dog dog; animal.speak(); // 输出: Animal sound... dog.speak(); // 输出: Woof! return 0; } ``` ### 9.3.2 多继承 除了单继承外,C++还支持多继承(Multiple Inheritance),即一个子类可以从多个基类那里继承特性。然而,多继承容易引发菱形继承等问题,所以在设计时应当谨慎考虑。 ```cpp class A { public: void funcA() { cout << "Class A function." << endl; } }; class B { public: void funcB() { cout << "Class B function." << endl; } }; class C : public A, public B {}; // 子类C同时继承自A和B int main() { C objC; objC.funcA(); // 输出: Class A function. objC.funcB(); // 输出: Class B function. return 0; } ``` ### 9.4 抽象类与接口 **前言** > 抽象类(Abstract Class)是指含有纯虚函数(Pure Virtual Function)的类,它不能被实例化,但可以作为其他类的基础。通过定义抽象类,我们可以建立一组通用接口,强制要求派生类实现这些接口,从而实现了一种类似于Java中接口(Interface)的功能。 ### 9.4.1 纯虚函数 所谓纯虚函数就是在基类中声明但并不给出具体实现的成员函数,它的形式是在函数原型后加上`= 0`。含有纯虚函数的类被称为抽象类抽象类自身无法创建对象,必须通过派生类来实现具体的版本。 ```cpp class Shape { public: virtual ~Shape() {} // 纯虚函数 virtual double area() const = 0; }; class Circle : public Shape { private: double radius; public: Circle(double r) : radius(r) {} // 实现纯虚函数 double area() const override { return M_PI * pow(radius, 2); } }; class Rectangle : public Shape { private: double width, height; public: Rectangle(double w, double h) : width(w), height(h) {} // 实现纯虚函数 double area() const override { return width * height; } }; int main() { Circle circle(5); Rectangle rect(4, 6); cout << "Circle Area: " << circle.area() << endl; cout << "Rectangle Area: " << rect.area() << endl; return 0; } ``` ### 9.5 总结 通过本章的学习,您应该对C++中的类与对象有了初步的认识。掌握了类的定义、对象的创建与使用、继承与派生、以及抽象类与接口等内容后,便可以在实践中尝试应用这些理论知识,逐步培养面向对象编程的能力。下一章节将继续深入探讨更多高级主题,如模板(Template)、异常处理(Exception Handling)等,请保持期待! --- 以上便是关于C++中类与对象的基础介绍,希望能够帮助大家建立起对该领域的正确认知。如果有任何疑问或想要了解更多细节,欢迎随时提问交流!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值