纯虚函数和虚函数的联系

【1】相同点

目标一致:为了实现多态。

【2】不同点

(1)声明的区别:

1、纯虚函数的声明除过像虚函数加关键字virtual而外,还必须加 = 0;

2、声明为虚函数,为了能让这个函数在它的派生类里面被覆盖(或隐藏),这样编译器就可以通过后期绑定达到多态性。

3、声明为纯虚函数,有一种接口的规范作用。派生类必须且只能原样(同名同参)实现。这样编译器就可以通过后期绑定达到多态性。

(2)定义的区别:

1、虚函数在基类中必须实现(哪怕空操作)。派生类里面也可以不覆盖(或隐藏)。

2、纯虚函数在基类中不允许定义(也可以理解为加 = 0; 的约束),必须在其派生类里面去实现。

(3)存在的区别:

一个类中可以只有纯虚函数,也可以只有虚函数,或者两者同时存在均可。

(4)存在对一个类的作用区别:

一个类的声明中,即使有一个纯虚函数,那么这样的类叫做虚基类(或抽象类)。

这种基类不能直接声明对象,只能被继承,且派生类只有在实现其纯虚函数后才能使用。

 

Good Good Study, Day Day Up.

顺序 选择 循环 总结

### 纯虚函数虚函数的区别及使用场景 #### 一、基本概念 在 C++ 中,`虚函数` `纯虚函数` 是用于实现多态的关键特性。以下是它们的核心定义: - **虚函数**:通过在基类中声明为 `virtual` 的成员函数,可以在派生类中对其进行重新定义(即覆写 Override),从而实现运行时的动态绑定[^1]。 - **纯虚函数**:是一种特殊的虚函数,它没有具体的实现,仅作为接口存在。其形式为 `virtual 返回类型 函数名() = 0;`。含有纯虚函数的类被称为抽象类,无法直接实例化对象[^4]。 --- #### 二、主要区别 | 特性 | 虚函数 | 纯虚函数 | |-------------------|-------------------------------------------|-----------------------------------------| | 是否有默认实现 | 提供具体实现 | 不提供任何实现 | | 类型 | 普通成员函数 | 抽象接口 | | 子类是否必须实现 | 可以选择性覆盖 | 必须在子类中实现 | | 所属类 | 普通类 | 含有纯虚函数的类称为抽象类 | --- #### 三、语法示例 ##### 1. 虚函数示例 ```cpp class Base { public: virtual void display() { // 虚函数,默认实现了功能 std::cout << "Base Class Display" << std::endl; } }; class Derived : public Base { public: void display() override { // 覆写了父类的虚函数 std::cout << "Derived Class Display" << std::endl; } }; ``` 当通过基类指针或引用调用 `display()` 方法时,会根据实际对象类型决定调用哪个版本的方法[^3]。 ##### 2. 纯虚函数示例 ```cpp class AbstractShape { public: virtual double area() const = 0; // 纯虚函数,无实现 virtual ~AbstractShape() {} // 析构函数建议设置为虚函数 }; class Circle : public AbstractShape { private: double radius; public: Circle(double r) : radius(r) {} double area() const override { // 实现了纯虚函数 return 3.14 * radius * radius; } }; ``` 由于 `AbstractShape` 包含了一个未实现的纯虚函数 `area()`,因此它是一个抽象类,不能创建其实例[^5]。 --- #### 四、适用场景 - **虚函数** - 当希望某些方法具有通用的行为,并允许派生类自定义特定逻辑时使用。 - 示例:日志记录器可能有一个通用的日志打印框架,但不同的模块可以根据需求调整细节[^1]。 - **纯虚函数** - 定义接口规范,强制要求所有派生类都必须实现某种行为。 - 示例:几何图形计算面积周长的功能通常可以通过纯虚函数来约束子类实现相应算法[^4]。 --- #### 五、注意事项 - 如果一个类包含至少一个纯虚函数,则该类成为抽象类,不允许直接实例化对象[^2]。 - 对于拥有虚函数的类来说,最好将其析构函数也声明为虚函数,这样可以避免因删除派生类对象而导致的资源泄露问题[^2]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值