抽象方法和纯虚函数是一回事吗?

Ahm*_*mad 52 c++ virtual function

据我所知,抽象方法和纯虚函数都没有提供任何功能......那么我们可以说它们都是同一个东西吗?

此外,假设一个类(不一定声明为抽象)包含许多实现的方法(不是抽象或虚拟),但包含纯虚函数.这个类是抽象的吗?

Gor*_*son 59

是的,他们是一回事.在C++中,抽象方法只是描述纯虚函数特征的另一种方法.两者都只是指一种没有实现的方法,需要在实际实例化类之前在子类中实现.

C++中纯虚函数和抽象类的情况类似,因为它们本质上意味着完全相同的事情.任何抽象类必须至少有1个纯虚函数,否则它可以被实例化,也不会是抽象的.同样,任何具有至少1个纯虚函数的类都必须是抽象的,因为它需要扩展才能实际实现该方法.

因此,当且仅当它包含至少1个纯虚函数/抽象方法时,类才是抽象的.

后来,像Java和C#这样的语言使这样的事情变得更加明确,允许一个特殊的关键字来定义类抽象,而不是纯虚函数的存在.C++允许您执行与这些语言相同的操作,但它们只是更明确一些.:d

  • 您不一定要在没有纯虚拟实例的情况下实例化一个类,例如,如果它没有可访问的构造函数.只是迂腐:-​​) (3认同)

Jor*_*dão 16

您没有在C++中将类或方法显式声明为抽象.纯虚方法的存在使它们成为抽象的.


Dav*_*nco 6

是的,抽象方法与纯虚函数完全相同; 这些术语通常可以互换使用.IMO,"纯虚函数"是C++技术上正确的术语,它具体表示该函数设置为0:

class myClass {
public:
  virtual void vfunc() = 0; // pure specifier
};
Run Code Online (Sandbox Code Playgroud)

抽象类定义为:

一个专门用作基类的类.抽象类包含至少一个纯虚函数.

所以基本上,抽象类是一个抽象类,因为它被设计成一个基类(根据定义,一些基类需要具有可实现的方法,这些方法需要是纯虚拟的).这些类只是根据它们的使用和扩展方式而成为抽象类.与Java这样的语言不同,没有abstractinterface关键字修饰符,所以这就是为什么我们需要一个"口头契约"来讨论C++中的抽象类.


Lig*_*ica 5

在C++中,纯虚拟成员函数导致封闭类型为"抽象类型".

函数本身不能是抽象的,尽管这个术语经常以这种方式被滥用.