我知道这个话题有很多问题。但是,我无法理解使用抽象类而不是虚拟类的确切需要。如果我没有弄错,抽象类也隐含地是一个虚拟类,它们之间的唯一区别是抽象方法必须在子类中重写。那么,为什么虚拟课堂不够?在哪些情况下,我们确实需要抽象类而不是虚拟类?为什么我们需要抽象类而不是虚拟类?
回答
首先,没有“虚拟课堂”这样的东西。我假设你打算说一个多态类(至少有一个虚拟成员函数,当然是一个虚拟析构函数)。
抽象类(至少具有一个纯虚拟成员函数)没有“需要”,但它们有助于创建不能实例化的接口,但仅提供一组可覆盖的成员函数。它允许你提供一个通用的基类来协助多态,在这种情况下实例化这样一个普通的基类不会有任何用处,或者会违背设计者的意图。
/**
* 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 {}
};
应该指出的是'IType'必须将其析构函数声明为'virtual'。 – Nawaz 2014-10-30 13:34:52
@Nawaz:哦,是的,谢谢。也用于编辑。 – 2014-10-30 13:39:36
纯虚函数有一些“需求”:实现基类函数可能不太实际。例如,如果它返回的类型不能在没有对基类不可用的资源的情况下实例化。 – 2014-10-30 13:51:06
- 1. 为什么抽象派生类需要初始化一个虚拟基类?
- 2. 为什么我们在上课时需要抽象类?
- 3. 为什么我们在抽象类存在时需要接口?
- 4. 为什么我们有抽象类时需要接口?
- 5. 为什么我们需要Java中的抽象类?
- 6. 为什么我们需要C++中的抽象类?
- 7. 为什么需要抽象类?
- 8. 为什么需要抽象类?
- 9. 为什么你需要知道抽象类的抽象方法是否抽象
- 10. 为什么我们不能在WCF中使用抽象类而不是接口?
- 11. 为什么我们需要使用虚拟〜A()= default;而不是在C++ 11中虚拟〜A(){}?
- 12. 为什么我们需要包装类
- 13. 什么是算法中的抽象数据类型,为什么我们需要它们?
- 14. 为什么在我们的项目中需要接口层/抽象类?
- 15. 为什么HttpServletRequestWrapper类不是抽象的
- 16. 为什么我们需要虚拟内存?
- 17. 为什么我们需要虚拟桌面?
- 18. 使用虚拟类型(抽象类型)
- 19. 为什么HttpContext是一个抽象类而不是接口?
- 20. 为什么IDisposable是一个接口,而不是抽象类?
- 21. 为什么java.sql.Statement是一个接口而不是抽象类?
- 22. 从抽象类和具体类继承有什么区别?为什么我们需要后者?
- 23. 为什么我们需要键入 '( “+ I +”)',而不仅仅是 '(我)'
- 24. C#设计:为什么抽象方法需要new/override而不是虚拟方法?
- 25. 为什么我们要使用抽象类或方法,为什么不重写超类方法呢?
- 26. 使用分部类而不是抽象类有什么好处?
- 27. 为什么我的子类被认为是一个抽象类?
- 28. 为什么任何一种抽象都使用接口而不是抽象类?
- 29. 什么是抽象类型?
- 30. 为什么我们需要调用thread.start()而不是thread.run()?
没有“需要”。你为什么这么认为? – 2014-10-30 13:15:29
没有“虚拟课堂”这样的东西。所以答案是我们需要一个,因为另一个不存在。 – 2014-10-30 13:15:31
@KerrekSB那么什么是“虚拟基类”呢?对不起,如果我混淆的概念。 – zretscen 2014-10-30 13:30:23