C++里的虚函数 是不是没什么用处?

2025-02-27 11:46:39
推荐回答(3个)
回答1:

虚函数就相当于是在运行过程中的重载,它就是提供一个对外的默认接口。如果派生类中定义了这个借口,就使用派生类自己定义的接口,如果没有定义就用基类的。这就像我们买了一个U盘在windows下使用,windows自带了一个U盘的接口驱动程序,U盘也有一个自身的驱动程序。我们将U盘直接插到电脑上,用windows自带的程序也能正常使用U盘,可如果我们把U盘自带的驱动程序装上,那是用的就是自带的驱动,而这个驱动可能会比windows的好用,可能使U盘存取速度更快。有点罗嗦。。虚函数应该明白了吧。

虚基类。。在多重继承中会产生二义性,虚基类正是用来解决二义性的方法。至于什么是二义性,看下面代码
class a
{
public:
show();
};
class b:public a
{};
class c:public b
{};
class d:public a,public b
{};
类b和c都是从类a继承下来的,在b和c中都应该分别有一个show();类d是从b和c继承而来的,那么在d中应该有两个相同的show();这时如果调用d中的show();,就不知道到底要调用哪个,因为这两个函数没有区别,当然可以用成员名限定的方法来调用,可这不是根本的解决方法,所以就有了虚基类。虚基类可以使多层继承路径中的公共基类只产生一个实例。这就减少了很多重复代码,节省开销。
下面说一下接口
说到接口就要提到纯虚函数、抽象类。纯虚函数就是在基类中不提供函数实现,而要在派生类中提供实现。至少有一个纯虚函数的类成为抽象类。
纯虚函数格式,比如上面的代码,把类a中改为
virtual show()=0;这就是一个纯虚函数。在它的派生类中必须要提供实现。那么这就是一个借口的概念。还以windows为例。我们使用的软件、硬件多得无法计算。windows不可能为每一种软硬件都提供一个默认的驱动。于是windows就提供一个接口,如果一款软件或硬件想在windows上运行的话,好,那你根据我的接口规则,自己开发驱动程序。所以纯虚函数和虚函数的区别就是虚函数有一个默认的实现,而纯虚函数没有。就是开发者不提供自己产品的驱动,在纯虚函数为接口时就不能使用,但在虚函数做接口时就可以使用

楼主说“认真点,多定义几个对象”这句我没明白指的是什么,但我要告诉你,创建一个对象的话,是要调构造、析构等等,反正开销是很大的,所以能不创建对象就能解决的问题就不要创建对象。

回答2:

用处很大
多态就需要用虚函数
接口通常指类提供给外部调用它的函数,可狭义理解为一个class的public method
推荐看一下thinking in c++,三言两语是说不清楚的

回答3:

C++精华之一虚函数没用?

那你可以转行Java了,那个没有虚函数。