Sla*_*zer 11 c++ static abstract-class class c++11
这是一个纯粹的抽象类吗?
class C
{
public:
static const std::string S;
C() {}
virtual ~C() {}
virtual void v() = 0;
}
Run Code Online (Sandbox Code Playgroud)
我认为不是,遵循这个[1]定义.
纯Abstract类只有抽象成员函数,没有数据或具体成员函数.
它不能是纯抽象的,因为它不只有抽象的成员函数.
现在我的老师声称这是一个纯粹的抽象类,因为
纯虚拟类中包含的常量不被视为属性.它们是一个阶级的不可变元素,因此它们不违反其抽象性.这同样适用于静态方法.
[1] https://en.wikibooks.org/wiki/C%2B%2B_Programming/Classes/Abstract_Classes
[2] 如果一个类有一个非纯粹的析构函数,它仍然可以是纯抽象的吗?
[3] http://en.cppreference.com/w/cpp/language/destructor
[4] 抽象方法和纯虚函数是一回事吗?
总结一下上面的评论:
构造函数和析构函数有点特殊。要点是,对于每个可以实例化的类,它们都必须存在,即使它只能作为派生类实例的一部分进行实例化。原因是创建派生类首先构造基类,为此它需要一个构造函数。假设抽象基类没有任何数据,这个构造函数可能很简单。
(世界标准时间 2015 年 10 月 18 日 @ 13:46,乌尔里希·埃克哈特 (Ulrich Eckhardt))
C++ 标准根本没有定义术语“纯抽象类”,因此可以说 C++ 中不存在纯抽象类;或者,您可以将特定的 C++ 构造声明为“纯抽象类”,只要讨论中的其他参与者同意使用您的定义就可以。只需要求您的老师阐明他或她所使用的术语的准确定义即可;没有什么比定义性论证更能让人兴奋不已了。
(世界标准时间 2015 年 10 月 18 日 @ 14:07,作者:Igor Tandetnik)
您提供的定义在 C++ 上下文中有点无用。一方面,C++ 没有抽象成员函数(它有纯虚函数)。C++ 类(几乎)总是有一个构造函数(可能是隐式构造函数),该构造函数不能是虚拟的,因此如果您坚持将构造函数算作成员函数,则没有 C++ 类将与定义匹配。至于静态数据成员,即使具有明确抽象类概念的语言(例如Java)也不会禁止这些成员。关键是该类不应该有每个实例的数据。
(世界标准时间 2015 年 10 月 19 日 @ 02:03,作者:Igor Tandetnik)