2014-10-30 120 views
3

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

+0

没有“需要”。你为什么这么认为? – 2014-10-30 13:15:29

+9

没有“虚拟课堂”这样的东西。所以答案是我们需要一个,因为另一个不存在。 – 2014-10-30 13:15:31

+1

@KerrekSB那么什么是“虚拟基类”呢?对不起,如果我混淆的概念。 – zretscen 2014-10-30 13:30:23

回答

6

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

抽象类(至少具有一个纯虚拟成员函数)没有“需要”,但它们有助于创建不能实例化的接口,但仅提供一组可覆盖的成员函数。它允许你提供一个通用的基类来协助多态,在这种情况下实例化这样一个普通的基类不会有任何用处,或者会违背设计者的意图。

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

应该指出的是'IType'必须将其析构函数声明为'virtual'。 – Nawaz 2014-10-30 13:34:52

+0

@Nawaz:哦,是的,谢谢。也用于编辑。 – 2014-10-30 13:39:36

+0

纯虚函数有一些“需求”:实现基类函数可能不太实际。例如,如果它返回的类型不能在没有对基类不可用的资源的情况下实例化。 – 2014-10-30 13:51:06