C++ 为什么我们需要抽象类而不是虚拟类?

C++ 为什么我们需要抽象类而不是虚拟类?,c++,oop,C++,Oop,我知道在这个话题上有很多问题。然而,我无法理解使用抽象类而不是虚拟类的确切需求。如果我没有弄错的话,抽象类也隐含着一个虚拟类,它们之间的唯一区别是抽象方法必须在子类中重写。那么,为什么虚拟类还不够呢?在哪些情况下,我们确实需要抽象类而不是虚拟类 首先,没有所谓的“虚拟类”。我假定您的意思是一个多态类(至少有一个虚拟成员函数,当然还有一个虚拟析构函数) 抽象类(至少有一个纯虚拟成员函数的类)没有“需要”,但它们有助于创建无法实例化的接口,而只提供一组可重写的成员函数。它允许您提供一个公共基类来帮助

我知道在这个话题上有很多问题。然而,我无法理解使用抽象类而不是虚拟类的确切需求。如果我没有弄错的话,抽象类也隐含着一个虚拟类,它们之间的唯一区别是抽象方法必须在子类中重写。那么,为什么虚拟类还不够呢?在哪些情况下,我们确实需要抽象类而不是虚拟类

首先,没有所谓的“虚拟类”。我假定您的意思是一个多态类(至少有一个虚拟成员函数,当然还有一个虚拟析构函数)

抽象类(至少有一个纯虚拟成员函数的类)没有“需要”,但它们有助于创建无法实例化的接口,而只提供一组可重写的成员函数。它允许您提供一个公共基类来帮助多态性,如果实例化这样一个公共基类将毫无用处或者违背设计者的意图

/**
 * Instantiating `IType` cannot serve a purpose; it has
 * no implementation (although I _can_ provide one for `foo`).
 * 
 * Therefore, it is "abstract" to enforce this.
 */
struct IType
{
   virtual void foo() = 0;
   virtual ~IType() {}
};

/**
 * A useful type conforming to the `IType` interface, so that
 * I may store it behind an `IType*` and gain polymorphism with
 * `TypeB`.
 */
struct TypeA : IType
{
   virtual void foo() override {}
};

/**
 * A useful type conforming to the `IType` interface, so that
 * I may store it behind an `IType*` and gain polymorphism with
 * `TypeA`.
 */
struct TypeB : IType
{
   virtual void foo() override {}
};

没有所谓的“虚拟类”。所以答案是我们需要一个,因为另一个不存在。@KerrekSB那么什么是“虚拟基类”?。很抱歉,我混淆了这些概念。@查拉图斯特拉:虚拟继承完全是另一个主题,与抽象类和虚拟函数无关。它确定多重继承是导致公共基类的单个实例还是多个实例。有时,能够表达独立类型(不是基类继承层次结构的一部分)需要符合的纯(虚拟)接口是很好的。在“虚拟基类”中,是基是虚拟的,而不是类。虚拟性是对应的基子对象的属性。应该注意的是,
IType
必须将其析构函数声明为
virtual
。纯虚拟函数有某种“需要”:实现基类函数可能不实际。例如,如果它返回的类型没有基类不可用的资源就无法实例化。@MikeSeymour:在许多情况下,它当然很方便。