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

标签 c++ oop

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

最佳答案

首先,“虚拟类”是不存在的。我假设你的意思是说一个多态类(至少有一个虚拟成员函数,当然还有一个虚拟析构函数)。

没有“需要”抽象类(那些至少有一个纯虚拟成员函数的类),但它们有助于创建不能实例化的接口(interface),但只提供一堆可重写的成员职能。它允许您提供一个公共(public)基类来帮助实现多态性,以防实例化这样一个公共(public)基类没有任何意义或违背设计者意图的情况。

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

关于c++ - 为什么我们需要抽象类而不是虚拟类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26653990/

相关文章:

c++ - 使用 "operator T*()"而不是 "T* operator->()"进行成员访问

c++ - 为什么 unordered_map 和 map 提供相同的性能?

C++ 二维阵列乒乓球板

c++ - 将类查看到容器中

iphone - Objective-C——子类中委托(delegate)的子类

java - 我们可以直接实例化一个抽象类吗?

c++ - 是否保证像 std::queue 这样的 C++ 标准库容器是可重入的?

java - 为什么Java中必须指定方法的返回类型?

python - 解释 Python 的 '__enter__' 和 '__exit__'

用于处理大型 XML 的 Java OO 设计