虚函数与抽象类:在继承层次结构中使用多态
发布时间: 2024-02-01 02:42:12 阅读量: 56 订阅数: 49
# 1. 面向对象编程基础
### 1.1 面向对象编程的基本概念
面向对象编程(Object-oriented programming,简称OOP)是一种程序设计的方法论,它将现实世界中的对象抽象成程序中的类(Class),并通过封装(Encapsulation)、继承(Inheritance)和多态(Polymorphism)等概念来组织和管理代码。
在面向对象编程中,类是对象的模板,它描述了对象的属性和行为。属性可以是对象的状态,而行为是对象可以执行的操作。通过封装,类将数据和方法组合在一起,形成了一个独立的单元,外部只能通过公有接口来访问这个单元,从而实现了信息隐藏和代码复用的目的。
### 1.2 封装、继承和多态的概念
封装(Encapsulation)是面向对象编程的一项基本原则,它将数据和操作数据的方法封装在一起,形成了一个类。封装提供了对象的内部实现细节的隐藏,只暴露了必要的公共接口供外部访问,降低了代码的耦合性,提高了代码的可维护性和可复用性。
继承(Inheritance)是面向对象编程的一种机制,它允许一个类继承另一个类的属性和行为。通过继承,子类(Derived class)可以拥有父类(Base class)的属性和方法,并且可以在此基础上进行扩展和修改,实现了代码的重用性和扩展性。
多态(Polymorphism)是面向对象编程的一个核心概念,它指同一个方法调用可以根据对象的不同而有不同的行为。这意味着父类的引用可以指向子类的对象,并且可以根据实际所引用对象的类型来调用相应的方法。通过多态,我们可以实现更灵活的代码设计和组织。
### 1.3 多态在实际编程中的应用
多态在实际编程中的应用非常广泛。以图形绘制为例,我们可以定义一个基类 `Shape` 表示各种形状,其中包含一个方法 `draw()` 来绘制图形。然后我们可以派生出不同的子类如 `Rectangle` 和 `Circle`,它们都重写了 `draw()` 方法以实现各自的绘制逻辑。此时,我们可以定义一个方法接收 `Shape` 对象作为参数,并调用 `draw()` 方法,而不需要关心具体是哪种形状,实现了解耦和灵活性。
```python
class Shape:
def draw(self):
pass
class Rectangle(Shape):
def draw(self):
print("Drawing a rectangle")
class Circle(Shape):
def draw(self):
print("Drawing a circle")
def draw_shape(shape):
shape.draw()
rect = Rectangle()
circle = Circle()
draw_shape(rect) # 输出:Drawing a rectangle
draw_shape(circle) # 输出:Drawing a circle
```
在上述代码中,`Shape` 类是一个抽象类,其中的 `draw()` 方法是一个虚函数。派生类 `Rectangle` 和 `Circle` 重写了 `draw()` 方法,实现了多态的效果。通过调用 `draw_shape()` 方法,可以根据实际的对象类型来选择调用哪个 `draw()` 方法。
# 2. 虚函数的概念与用法
在面向对象编程中,虚函数是一种非常重要的概念,它允许在继承层次结构中实现多态,使得程序在运行时能够动态地选择调用哪个函数。接下来,我们将深入探讨虚函数的概念和用法。
### 2.1 什么是虚函数?
在C++和Java等面向对象编程语言中,虚函数是通过使用关键字`virtual`来声明的成员函数。它允许子类重写父类的该函数,实现多态性的关键。
### 2.2 虚函数的声明和定义
虚函数的声明非常简单,只需要在函数声明前加上`virtual`关键字即可。下面是一个C++中虚函数的声明和定义示例:
```cpp
class Base {
public:
virtual void show() {
cout << "Base class show function" << endl;
}
};
class Derived : public Base {
public:
void show() {
cout << "Derived class show function" << endl;
}
};
```
### 2.3 虚函数的重写与重载
子类可
0
0