2010-11-25 29 views
2

我有困扰我几天的问题。C++中的抽象类机制有什么特别之处?

抽象类是一种特殊类型的类,我们不能实例化,对吗? (通过对至少一个方法声明给出一个“= 0”来表示/指定,这看起来像是一个事后考虑)。

抽象类机制为C++带来了额外的好处,即“普通”基类无法实现?

回答

7

按照wikibooks section on abstract classes

这迫使类的设计者和这个类的用户之间的合同的一种方式。如果我们希望从一个抽象类创建一个具体类(一个可以被实例化的类),我们必须为每个基类的抽象成员函数声明和定义一个匹配的成员函数。

如上所述,这是一种定义派生类必须遵守的接口的方法。他们的抽象类Vehicle的例子非常合适:在现实生活中你永远不会只有一个Vehicle,你会有一辆福特Explorer或一辆丰田普锐斯,但这两者都符合(为了争辩)一个基本集合的功能可以定义为Vehicle。但是,你不能只去Vehicle经销店,并从Vehicle开车。因此,你永远不希望能够构建和使用你真的想要一个专门的派生对象的基础对象。

2

这提供了C++中最好的方式来定义一个没有任何默认实现的接口。 C#的interface概念。

+0

我们可以定义一个基类并选择不提供任何(虚拟)方法的实现,派生类将提供方法的实现。我们可以实例化这个基类但不能调用任何方法。抽象类提供的额外事物是我们不能实例化类本身,我是否正确? – riderchap 2010-11-25 19:33:21

1

这相当于Java变成了“接口”的东西。基本上,它意味着类本身不可用 - 您需要覆盖所有纯方法。

一个例子是MFC的CView类,它有一个纯粹的OnDraw方法 - 基本的CView没有做任何事情,并且是无用的。你必须重写OnDraw。

(顺便说一句 - 它仍然可能提供一个纯粹的方法的实现,子类实现可以回落到它,但他们仍然必须提供自己的覆盖。)

0

它们被用来作为基础类层次结构设计中的类。
抽象类用于为所有派生类定义干净的接口。
在设计阶段,抽象类根据规范定义一个接口,派生类相应地实现所需的功能。
另外使用抽象类而不是“普通”类有助于从接口分离实现细节。
具体类实现了一个接口,但抽象类定义了它。您可以在设计中使用具体类作为基类,但抽象类并不意味着直接在代码中使用,并且不能实例化。他们作为原型。
正如你所说的,通过使用“normal”类,你必须为所有方法定义一个实现。

0

不要在课堂上考虑它。

看的方法,并认为它应该在默认的情况下做什么:

virtual std::string getName() const = 0; 

什么是这个方法的正确实施?没有比我想象的更多的东西。

通过将其标记为“纯虚拟”,您可以确保如果用户获得了从您的接口派生的类的实例,则此方法将具有合理的行为。

唯一的其他的方式做这将是一个throw NotImplemented("getName");身体,但你会在运行时发现的问题,而不是在编译时,这是不一样好:)

相关问题