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

时间:2014-10-30 13:15:01

标签: c++ oop

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

1 个答案:

答案 0 :(得分:6)

首先,没有“虚拟课”这样的东西。我假设你打算说一个多态类(至少有一个虚拟成员函数,当然还有一个虚析构函数)。

抽象类(至少有一个纯虚拟成员函数)没有“需要”,但它们有助于创建无法实例化的 interfaces ,但只提供了一堆可重写的成员功能。它允许你提供一个共同的基类来帮助实现多态性,如果实例化这样一个共同的基类没有任何意义,或者会违背设计者的意图。

/**
 * 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 {}
};