是啥使某物成为 C++ 中的抽象类 [重复]
Posted
技术标签:
【中文标题】是啥使某物成为 C++ 中的抽象类 [重复]【英文标题】:What makes something an Abstract Class in C++ [duplicate]是什么使某物成为 C++ 中的抽象类 [重复] 【发布时间】:2011-05-25 20:36:31 【问题描述】:可能重复:What is the difference between a concrete class and an abstract class?
当我将光标悬停在其中一个类上时,我正在用 Visual C++ 2008 编写我正在阅读的书中做一个练习,它告诉我这是一个抽象类。现在我知道它是一个抽象类,因为这就是本练习的内容,但我很好奇是什么让 Intelisense 知道它是一个抽象类。
我做了一点功课,发现这可能是因为我在这个类中有两个虚函数,其中一个是纯虚函数。
纯虚拟是一个死的赠品,还是有其他东西可以告诉您正在处理或查看抽象类?
【问题讨论】:
类似于其他关于 C++ 抽象类的问题,例如 ***.com/questions/1298093/c-abstract-class @Kev 你好像对C++一无所知,怎么判断这是不是骗子? @neil - 它在同一领域。检查***.com/questions/2149207 中接受的答案 - 准确告诉他抽象类是什么 @kev 投票最多的答案恰好是错误的,如果使用它会表现出未定义的行为。 【参考方案1】:纯粹的虚拟是死的赠品吗
在 C++ 中,是的。由于它没有abstract
关键字或等效关键字,因此将类抽象化的常用习惯是在其中声明一个纯虚函数(这会阻止实例化)。*
出于同样的原因,在 C++ 中,接口 和 抽象类 之间没有太大区别——C++ 接口只是一个仅包含纯虚函数的类。
*更新:防止类实例化的另一种方法是声明其构造函数protected
或private
。后者意味着它也不能被子类化,但前者不会阻止子类化,因此理论上受保护的构造函数也可以是抽象类的标志一种强制子类化的方法。但是,我在实践中从未见过这种情况。我相信这是因为抽象类被设计为可扩展的,这在实践中几乎总是意味着它具有虚函数。我们之所以希望它是抽象的,是因为它的某些部分实现尚不为人所知,因此要在其子类中定义。这正是纯虚函数的意义所在。
【讨论】:
如果我有一个没有纯虚函数但有一些常规虚函数的抽象类怎么办?它还会被认为是抽象的吗? @Afrika,如果它没有纯虚函数,它可以被实例化(除非它的构造函数被声明为非公共的,也就是说),因此它不是抽象的。 @Afrika:这就像在问“如果我有一个奇数的偶数怎么办?它仍然是偶数吗?”唯一可能的答案是“是和不是”。 实际上,“抽象”在 C++ 中有特定的含义,参见 C++ 标准的第 10.4 节。你不能实例化一个类的事实并不意味着它是抽象的。 @Neil,你是对的,感谢您的澄清。【参考方案2】:使类抽象的唯一因素是它是否具有一个或多个未实现的纯虚函数,可能是派生的。
struct A // abstract
virtual void f() = 0;
;
struct B : public A // abstract
;
struct C : public B // not abstract
void f()
;
请注意,A 还应该有一个(可能不是纯的)虚拟析构函数。
也可以实现纯虚函数,但这很少见:
struct D
virtual void f() = 0;
;
函数必须在类外定义:
void D :: f()
但该类仍然是抽象的。
【讨论】:
-1。错误的答案。即使纯虚函数有实现,也可以是抽象的。 @Neil。好的。删除了反对票。对不起。 +1。因其完整性和简洁性而受到好评。 @Neil:如果我看到一个带有严重错误的答案,我会投反对票并对错误发表评论。如果错误得到纠正,我会删除我的反对票。但这只是我。 嗯,是的,对于一个“严重错误”,或者至少对于一个危险的错误(这不是)我做同样的事情,但在这种情况下,我们谈论的是很少使用的功能实现一个纯函数,出于教学目的我省略了。【参考方案3】:我不会说我是 C++ 方面的专家,但我会说你已经掌握了它。纯虚方法的存在意味着该类不能被实例化,因此是抽象。如果您的所有方法都是纯虚拟的(即没有实现),它将是一个接口,在这种情况下您只需要头文件。
【讨论】:
以上是关于是啥使某物成为 C++ 中的抽象类 [重复]的主要内容,如果未能解决你的问题,请参考以下文章