这是一个纯粹的抽象类吗?
class C
{
public:
static const std::string S;
C() {}
virtual ~C() {}
virtual void v() = 0;
}
我相信它不是,跟随this definition from WikiBooks:
纯Abstract类只有抽象成员函数,没有数据或具体成员函数。
它不能是纯抽象的,因为它不只有抽象的成员函数:
现在我的老师声称这是一个纯粹的抽象类,因为:
纯虚拟类中包含的常量不被视为属性。它们是类的不可变元素,因此它们不违反其抽象性。静态方法也是如此。
总结以上评论:
构造函数和析构函数是特殊的。关键是它们必须存在于每个可以实例化的类中,即使它只能被实例化为派生类的实例的一部分。原因是创建派生类首先构造基类,它需要一个构造函数。假设抽象基类没有任何数据,那么这个构造函数可能很简单。
(Ulrich Eckhardt于2015年10月18日@ 13:46 UTC)
C ++标准根本没有定义术语“纯抽象类”,因此可以说C ++中不存在纯抽象类;或者,您可以将特定的C ++构造声明为“纯抽象类”,只要讨论中的其他参与者同意使用您的定义,那就没问题。只要让你的老师详细说明他或她正在劳动的术语;没有什么比得到一个人的果汁流动的定义论证了。
(10月18日,'15 @ 14:07 UTC,Igor Tandetnik)
您提供的定义在C ++的上下文中是无用的。首先,C ++没有抽象的成员函数(它有纯虚函数)。 C ++类(几乎)总是有一个构造函数(可能是一个隐式的),它不能是虚拟的,所以如果你坚持将构造函数计算为成员函数,那么没有C ++类会匹配定义。对于静态数据成员,即使是具有抽象类概念(例如Java)的语言也不会禁止这些。关键是该类不应具有每实例数据。
(10月19日,'15 @ 02:03 UTC,Igor Tandetnik)
抽象类是一个声明但没有定义的类
C ++中的纯抽象类也被视为接口。
因此,任何不变的声明都不违反阶级抽象的纯洁性。在IDL中,您可以在接口内部和外部声明常量。
但是,静态成员,构造函数(甚至是空的析构函数)和非抽象析构函数都会破坏纯度。所以纯粹的抽象类看起来如下
class C
{
public:
const std::string S = "Message";
virtual ~C() = 0;
virtual void V() = 0;
};
C ++标准没有定义什么是“纯抽象”类,也没有任何普遍接受的语言无关定义适用于所有语言。
你引用的定义1对我来说在C ++环境中没有多大意义。您的老师声称与语言设计更加一致。使用方便和必要的任何定义。无论如何,这个概念本身并不重要。
来自WikiBooks的定义肯定来自java
界面。创建后者是为了解决单继承规则的限制。 Java类可以有一个超类并实现多个接口。
Java接口具有:
它没有构造函数,变量,也没有this
指针。默认或静态方法只能访问静态变量。
使用上面的模板,您的类示例不适合定义,因为它定义了一个构造函数。接口没有构造函数。因此,只有默认构造函数的类才适合。 Java中没有析构函数的概念,所以如果你的析构函数是否具有析构函数并不重要。
C ++中不需要处理Java类型的接口,因为它支持多重继承。这些类可以任意具有抽象函数。
Java还有abstract
类的概念。这是具有一个或多个抽象函数成员的类。除了单继承规则之外,它们与具有抽象函数的C ++类非常相似。 Java中也没有pure abstract
类的概念(除非有人讨论接口)。