纯抽象类可以包含静态常量、静态方法或非虚析构函数吗?
Can a pure abstract class contain static constants, static methods or non-virtual destructors?
这是一个纯抽象类吗?
class C
{
public:
static const std::string S;
C() {}
virtual ~C() {}
virtual void v() = 0;
}
我相信它不是,根据维基教科书的定义:
纯抽象类只有抽象成员函数,没有数据或者具体的成员函数。
不能是纯抽象的,因为它不只有抽象的成员函数:
- 有一个虚析构函数,它是一个成员函数,但不是抽象的。它不是一个纯粹的析构函数。注意"抽象方法"answers"纯虚函数"是一回事,术语"方法"answers"函数"是同义词。
- 有一个属性S,表示数据。
现在我的老师声称这是一门纯粹的抽象课,因为:
纯虚类中包含的常量不被认为是属性。它们是类的不可变元素,因此不会违反类的抽象性。静态方法也是如此。
总结以上评论:
构造函数和析构函数有点特殊。关键是它们必须存在于每个可以实例化的类中,即使它只能作为派生类实例的一部分实例化。原因是创建派生类首先构造基类,而基类需要构造函数。假设抽象基类没有任何数据,那么这个构造函数可能很简单。
(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 by 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接口有:
- 抽象方法 <
- 常量/gh>静态变量和方法
- 默认方法。
它没有构造函数、变量和this
指针。默认方法或静态方法只能访问静态变量。
Java也有abstract
类的概念。这类具有一个或多个抽象函数成员。它们非常类似于带有抽象函数的c++类,除了单一继承规则。在Java中也没有pure abstract
类的概念(除非有人谈论接口)。
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- C++:使用方法调用析构函数的顺序是什么?
- 未调用的初始化静态thread_local结构的构造函数和析构函数
- 在析构函数中删除单链表的正确方法是什么?
- 哪种方法更适合处理虚拟析构函数?
- 显式调用 typedef'd 类类型的析构函数的正式正确方法
- C++ std::线程调用方法,从对象原因到调用此类的析构函数
- 即使没有析构函数,非静态类成员也会被销毁吗?
- 为什么不调用全局静态变量的析构函数
- 链表的析构函数方法
- 从C++中的虚拟析构函数调用虚拟方法
- 是在 C 或 C++ 析构函数中模拟 GO 语言 defer 的实用方法
- 这是删除析构函数中的数组的正确方法吗?
- C++-销毁顺序-函数的静态成员在主类析构函数之前被销毁
- 在其赋值运算符方法中调用对象的析构函数
- 未调用静态全局结构的析构函数
- 为静态分配的变量手动调用析构函数
- 抛出可由C++98和C++1x编译的析构函数.有更好的方法吗
- C++虚拟析构函数导致调用基方法
- 纯抽象类可以包含静态常量、静态方法或非虚析构函数吗?