C++ 友元函数与虚函数的区别

2024 年 8 月 29 日 | 5 分钟阅读

在本文中,我们将讨论 友元函数虚函数 之间的区别。但在讨论它们的区别之前,我们必须了解 C++ 中的友元函数和虚函数。

什么是友元函数?

在 C++ 编程语言中,友元函数 是一个不属于某个类但可以访问其保护和私有元素的函数。这意味着友元函数可以像成员函数一样访问类的私有和保护成员,尽管它实际上不属于该类。友元函数使用类声明中的 friend 关键字声明。

友元函数的特点

友元函数 有几个特点。友元函数的一些主要特点如下:

1. 非类成员

与普通成员函数不同,友元函数使用 friend 关键字在类内部声明;它不属于类本身。

2. 访问私有和保护成员

通过克服封装障碍,友元函数可以访问它所属类的私有或保护成员。

3. 语法

尽管友元函数声明在类作用域之外声明,但它通常包含在类声明中。

4. 用法

在函数必须访问类的私有成员而又实际上不属于该类的情况下非常实用。

什么是虚函数?

C++ 中通过使用虚函数实现运行时多态性。它允许在运行时从基类指针或对派生类对象的引用调用相关方法。

虚函数的特点

虚函数 有几个特点。虚函数的一些主要特点如下:

1. 类成员

虚函数是使用 virtual 关键字定义的类成员。它旨在供派生类重写。

2. 多态性和继承

在类层次结构中,虚函数用于基类将函数指定为虚函数,而派生类独立实现它。它使多态行为成为可能。

3. 晚期绑定

晚期绑定 允许在运行时根据所引用对象的类型灵活地选择合适的函数实现,因为要调用的实际函数是在运行时确定的。

4. 语法

virtual 关键字用于标识虚函数,它们在基类中声明。之后,派生类使用 override 关键字来重写此函数。

5. 用法

它可应用于派生类可以修改其行为且基类必须提供通用接口的情况。

示例

我们来看一个例子来说明 C++ 中的友元函数和虚函数

输出

Using virtual function:
Drawing a circle.
Drawing a generic shape with 4 sides.
Using the friend function:
Number of sides: 0

说明

  1. Shape 类中有一个名为 draw() 的虚函数和一个名为 numSides 的私有成员。
  2. Circle 类继承自 Shape,并重写了 Draw()
  3. 友元函数 printNumSides 可以访问 Shape 类的私有成员 numSides。
  4. 我们在 main 函数中生成 Shape 和 Circle 的实例。之后,我们使用虚函数绘制形状,并使用友元函数打印边的数量。

虚函数和友元函数的区别

虚函数和友元函数之间有几个区别。虚函数和友元函数之间的一些主要区别如下:

1. 作用域

友元函数: 尽管友元函数在类中声明,但它不是类的成员。它可以访问它所属类的私有和保护成员。

虚函数: 虚函数是可以在派生类中重写的类成员函数。它有助于实现 运行时多态性

2. 访问控制

友元函数: 作为类的友元,它可以访问该类的私有和保护成员。

虚函数: 此函数可以在类的保护、私有或公共部分声明;但是,派生类的重写函数需要具有相同的访问级别。

3. 继承

友元函数: 派生类不继承它。它只是一个独立的函数,类的私有成员可以访问它。

虚函数: 派生类可以重写虚函数以提供自己的实现。它被派生类继承。

4. 调用

友元函数: 它不是用类对象调用的。相反,它像任何其他函数一样被调用。

虚函数: 这种函数使用指向基类的指针或引用调用;在运行时,它所引用或指向的对象的类型决定了将执行哪个函数。

5. 多态性

友元函数: 由于它不是类层次结构的一部分,因此它不参与多态性。

虚函数: 它通过允许程序在运行时根据对象的真实类型调用正确的函数来使多态性成为可能。

结论

总之,友元函数 旨在允许非成员函数访问类的私有和保护成员,而 虚函数 旨在允许派生类提供自己的实现以实现多态性。在 C++ 编程中,它们有多种用途并在各种上下文中实现。