【问题标题】:Are there pure abstract classes in C++?C++中有纯抽象类吗?
【发布时间】:2015-11-09 20:51:11
【问题描述】:

有一个作业问题询问 C++ 中的什么构造类似于 Java 接口。 Java中的接口可以称为纯抽象类,我知道C++有抽象类,但是纯抽象类是C++官方有的东西

也许从 C++ 设计者的角度来看不是这样,但从技术上讲,可以通过使所有方法抽象来在 C++ 中创建一个纯抽象类吗?

我查看了this 资源,但在阅读了一些答案后我仍然感到困惑......

【问题讨论】:

  • C++ 不强制执行任何特定的编程风格,您可以执行过程、OOP 或模板。它还允许你创建一个只有纯虚函数的接口,但它不会强迫你这样做。您还可以对非纯基类使用多重继承——您的选择!

标签: c++ class interface abstract


【解决方案1】:
class Foo {
public:
    Foo();
    virtual ~Foo() {};
    virtual void bar() = 0;
}

Foo 是 C++ 中的纯抽象类,因为它包含方法 bar(),这是一个纯虚方法。

【讨论】:

  • 你也应该使用虚拟析构函数
  • 我不是很懂C++,所以这里提一个问题;考虑到类没有状态,这里的构造函数和析构函数声明真的是强制性的吗? C++ 默认不填充这些吗?既然是Java,规则当然不一样,不过我也想知道……
  • @fge 在 C++ 中,基构造函数和析构函数在派生类的构造函数析构函数被调用时被调用。您的代码可能会在没有构造函数和析构函数的情况下编译和运行。但是为了避免进入未定义的领域,您至少必须有一个虚拟析构函数。正如我在回答这个问题并忘记声明析构函数虚拟时向我指出的那样;)请参阅this answer 关于虚拟析构函数。
  • @fge C++ 将制作一个简单的构造函数和析构函数;然而,我们需要为接口声明我们自己的析构函数,因为我们需要它是纯虚拟的(注意在这个例子中它不是纯虚拟的,但它应该是)。构造函数声明是不必要的:永远无法构造此类,并且接口通常没有要构造的成员。因此,最简单的接口是:class Simple { virtual ~Simple() = 0 {} };
  • 构造函数声明不是必需的。
【解决方案2】:

是的,你可以在 C++ 中创建一个抽象类

class A {

public:
    A() {};
    virtual ~A(){};
    virtual void temp() = 0;
};

int main () {
    A a; // compiler error
}

【讨论】:

  • 为什么是 -1 ?你能解释一下吗?
  • 不是反对者,而是一个纯抽象类应该有一个虚拟析构函数。
  • @NathanOliver 我知道通过接口向上转换会导致内存泄漏,因为不会调用派生类的析构函数。这个例子只是为了简单。无论如何,我会进行编辑
  • @NathanOliver 完全同意!
猜你喜欢
  • 2015-08-14
  • 2013-01-15
  • 2012-10-01
  • 2019-01-01
  • 2014-10-09
  • 2019-05-17
  • 2011-01-06
  • 1970-01-01
  • 2019-12-14
相关资源
最近更新 更多