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