C++ 纯抽象类可以包含静态常量、静态方法或非虚拟析构函数吗?

C++ 纯抽象类可以包含静态常量、静态方法或非虚拟析构函数吗?,c++,class,c++11,static,abstract-class,C++,Class,C++11,Static,Abstract Class,这是一个纯抽象类吗 class C { public: static const std::string S; C() {} virtual ~C() {} virtual void v() = 0; } 我相信情况并非如此,原因如下: 纯抽象类只有抽象成员函数,没有数据 或具体的成员功能 它不能是纯抽象的,因为它不只有抽象成员函数: 它有一个,但不是抽象的。请注意,术语“方法”和“函数”是同义词 它有一个表示数据的属性S 现在我的老师们声称这是一门纯粹的抽象课

这是一个纯抽象类吗

class C
{
public:
    static const std::string S;
    C() {}
    virtual ~C() {}
    virtual void v() = 0;
}
我相信情况并非如此,原因如下:

纯抽象类只有抽象成员函数,没有数据 或具体的成员功能

它不能是纯抽象的,因为它不只有抽象成员函数:

  • 它有一个,但不是抽象的。请注意,术语“方法”和“函数”是同义词
  • 它有一个表示数据的属性S
  • 现在我的老师们声称这是一门纯粹的抽象课,因为:

    纯虚拟类中包含的常量是不考虑的属性。它们是类的不可变元素,因此不会违反其抽象性。静态方法也是如此


    总结上述评论:


    构造函数和析构函数是一种特殊的函数。关键是,对于每个可以实例化的类,它们都必须存在,即使它只能作为派生类实例的一部分进行实例化。原因是创建派生类首先构造基类,它需要一个构造函数。假设抽象基类没有任何数据,这个构造函数可能很简单

    (Ulrich Eckhardt于10月18日15时13分46分拍摄)


    <> P> C++标准没有定义“纯抽象类”,因此可以认为C++中不存在纯抽象类;或者,你可以声明一个特定的C++构造为“纯抽象类”,只要讨论中的其他参与者同意使用你的定义,那就没问题了。只要让你的老师说出他或她正在努力学习的术语的精确定义;没有什么比定义性的争论更能让人畅所欲言了

    (10月18日,'15@14:07 UTC由Igor Tandetnik拍摄)


    <>你在C++中提供的定义是没有用的。首先,C++没有抽象成员函数(它有纯的虚拟函数)。C++类(几乎)总是有一个构造函数(可能是隐式的),它不能是虚拟的,所以如果你坚持将构造函数作为成员函数来计数,那么没有C++类会与定义匹配。至于静态数据成员,即使是具有抽象类明确概念的语言(例如Java)也不允许这些。关键是类不应该有每个实例的数据


    (10月19日,'15@02:03 UTC由Igor Tandetnik提供)

    维基百科的定义肯定来自
    java
    接口。后者是为了绕过单一继承规则的限制而创建的。Java类可以有一个超类并实现多个接口

    Java接口具有:

  • 抽象方法
  • 常数
  • 静态变量和方法
  • 默认方法 它没有构造函数、变量,也没有
    this
    指针。默认或静态方法只能访问静态变量

    使用上面的模板,您的类示例不符合定义,因为它定义了构造函数。接口没有构造函数。因此,只有默认构造函数的类才适合。Java中没有析构函数的概念,因此在您的案例中是否有析构函数并不重要

    <> P>不需要用C++处理java类型的接口,因为它支持多重继承。这些类可以具有任意抽象函数

    Java还有
    抽象类的概念。这是具有一个或多个抽象函数成员的类。它们与具有抽象函数的C++类非常相似,除了单个继承规则。Java中也没有纯抽象类的概念(除非提到接口)

    抽象类是一个有声明但没有定义的类

    C++中的纯抽象类也被认为是一个接口。

    因此,任何常量声明都不会违反类抽象性的纯洁性。在IDL中,可以在接口内部和外部声明常量

    但是,静态成员、构造函数(甚至是空的)和非抽象析构函数破坏了纯度。所以纯抽象类如下所示

    class C
    {
    public:
        const std::string S = "Message";
        virtual ~C() = 0;
        virtual void V() = 0;
    };
    

    < C++标准没有定义什么是“纯抽象”类,也没有任何一个普遍接受的语言独立定义,它能平等地适用于所有语言。p>
    <>你引用的定义1在C++上下文中对我没有多大意义。你的老师所说的更符合语言设计。使用任何方便和必要的定义。无论如何,这个概念本身并不重要

    类中的析构函数是虚拟的。构造函数和析构函数有点特殊。关键是,对于每个可以实例化的类,它们都必须存在,即使它只能作为派生类实例的一部分进行实例化。原因是创建派生类首先构造基类,它需要一个构造函数。假设抽象的基本类没有任何数据,这个构造函数可以是微不足道的。C++标准根本不定义“纯抽象类”,因此可以认为C++中不存在纯抽象类;或者,你可以声明一个特定的C++构造为“纯抽象类”,只要讨论中的其他参与者同意使用你的定义,那就没问题了。只要让你的老师说出他或她正在努力学习的术语的精确定义;没有什么比定义论点更能让人畅所欲言了。互联网上的一些网站使用了“pure”的定义。然而,语言中对抽象基类的唯一要求是它至少有