我有几天困扰我的问题。
抽象类是一种我们无法实例化的特殊类型,对吧? (通过给至少一个方法声明给出“= 0”来表示/指定,这看起来像是事后的想法)。
抽象类机制给C ++带来的额外好处是什么,“普通”基类无法实现?
答案 0 :(得分:7)
根据wikibooks section on abstract classes:
这是强制类设计者和该类用户之间签订合同的一种方式。如果我们希望从抽象类创建一个具体类(可以实例化的类),我们必须为基类的每个抽象成员函数声明和定义一个匹配的成员函数。
如上所述,这是一种定义派生类必须遵守的接口的方法。他们的Vehicle
抽象类的例子非常合适:你现在的生活中从来没有Vehicle
,你有福特探险者或丰田普锐斯,但那些都符合(为参数的缘故)一组Vehicle
可能定义的基本功能。但是,您不能只是前往Vehicle
经销商并开出Vehicle
。因此,您永远不希望能够构建和使用基本Vehicle
对象,而您真正需要一个专门的派生对象。
答案 1 :(得分:2)
这提供了在C ++中定义没有任何默认实现的接口的最佳方式。
C ++没有C#的interface
概念。
答案 2 :(得分:1)
这相当于Java变成了“接口”。基本上,它意味着类本身不可用 - 您需要覆盖所有纯方法。
一个例子是MFC的CView类,它有一个纯粹的OnDraw方法 - 基本的CView没有做任何事情,因此没用。你必须覆盖OnDraw。
(顺便说一句 - 仍然可以为纯方法提供实现,子类实现可以回退到它,但它们仍然必须提供自己的覆盖。)
答案 3 :(得分:0)
它们在类层次结构设计中用作基类 抽象类用于为所有派生类定义一个干净的接口 在设计阶段,抽象类定义一个接口,每个规范和派生类相应地实现所需的功能 使用抽象类而不是“普通”类有助于将实现细节与界面分离 具体类实现接口,但抽象类定义它。您可以在设计中使用具体类作为基类,但抽象类不能直接在代码中使用,也不能实例化。它们作为原型 通过使用正常的“正常”类,您必须为所有方法定义一个实现。
答案 4 :(得分:0)
不要在课堂上考虑它。
查看方法,并考虑在默认情况下它应该做什么:
virtual std::string getName() const = 0;
这种方法的正确实现是什么?没有我能想到的。
通过将其标记为“纯虚拟”,您可以确保如果用户获得了从您的界面派生的类的实例,那么此方法将具有合理的行为。
执行此操作的唯一方法是throw NotImplemented("getName");
正文,但是你会在运行时发现问题,而不是在编译时发现,这不是很好:)