C++是否为纯虚拟类创建默认的"构造函数/析构函数/复制构造函数/复制赋值运算符"?

use*_*091 9 c++ interface pure-virtual

C++编译器是否为这个"类"生成默认函数,如Constructor/Destructor/Copy-Constructor ...?

class IMyInterface
{
    virtual void MyInterfaceFunction() = 0;
}
Run Code Online (Sandbox Code Playgroud)

我的意思是不可能实例化这个"类",所以我认为没有生成默认函数.否则,人们说你必须使用虚拟析构函数.这意味着如果我没有定义析构函数虚拟,它将是默认创建的,而不是虚拟的.

此外,我想知道为纯虚拟接口定义虚拟析构函数是否合理,如上所述?(所以这里没有使用指针或数据,所以不需要破坏任何东西)

谢谢.

Lig*_*ica 5

是的。

没有任何措辞要求类可实例化才能隐式声明这些特殊成员函数。

这是有道理的 - 仅仅因为您无法实例化 Base,并不意味着 Derived 类不想使用这些函数。

struct Base
{
   virtual void foo() = 0;
   int x;
};

struct Derived : Base
{
   Derived() {};         // needs access to Base's trivial implicit ctor
   virtual void foo() {}
};
Run Code Online (Sandbox Code Playgroud)

看:

  • §12.1/5(演员)
  • §12.8/9(移动)
  • §12.8/20(副本)

  • “不想使用这些函数”当然是一种非常温和的表达方式——我看不出构造函数和析构函数有任何方法可以避免它。毕竟,在进入派生类构造函数的主体之前调用基类构造函数,对于析构函数反之亦然。 (3认同)

utn*_*tim 1

此外,我想知道为纯虚拟接口定义虚拟析构函数是否合理,就像上面的那样?(所以这里没有使用指针或数据,所以不需要破坏任何东西)

不仅合理,而且值得推荐。这是因为在虚函数层次结构的情况下,(自动)调用专用类的析构函数也会调用其基类的所有析构函数。如果未定义它们,您应该会收到链接错误。

如果您在类中至少定义了一个虚拟函数,那么您还应该定义一个虚拟析构函数。

析构函数可以这样定义=default

这是一个更正的(可编译的)代码示例:

class ImyInterface
{
    virtual void myInterfaceFunction() = 0;
    virtual ~ImyInterface() = 0;
}

ImyInterface::~ImyInterface() = default;
Run Code Online (Sandbox Code Playgroud)

  • 该定义需要放入“.cpp”文件中,否则您应该添加“inline”关键字。另外,当另一个成员已经将该类标记为抽象类时,将析构函数定义为纯虚拟有什么意义? (3认同)