首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++是否为纯虚拟类创建默认的“Constructor/Destructor/Constructor/Constructor/复制赋值运算符”?

C++是否为纯虚拟类创建默认的“Constructor/Destructor/Constructor/Constructor/复制赋值运算符”?
EN

Stack Overflow用户
提问于 2014-01-23 11:33:48
回答 4查看 5K关注 0票数 9

C++编译器是否生成默认函数,如构造器/析构函数/复制-构造器.为了这个“课”?

代码语言:javascript
复制
class IMyInterface
{
    virtual void MyInterfaceFunction() = 0;
}

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

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

谢谢。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2014-01-23 11:40:15

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

这不仅是合理的,也是推荐的。这是因为在虚拟函数层次结构的情况下,调用专门类的析构函数也会调用其基类的所有析构函数。如果没有定义它们,您应该得到一个链接错误。

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

但是,可以用=default定义析构函数:

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

代码语言:javascript
复制
class ImyInterface
{
    virtual void myInterfaceFunction() = 0;
    virtual ~ImyInterface() = 0;
}

ImyInterface::~ImyInterface() = default;
票数 1
EN

Stack Overflow用户

发布于 2014-01-23 11:41:59

是的,

没有任何措辞要求类是可实例化的,以便隐式声明这些特殊的成员函数。

这是有意义的--仅仅因为不能实例化Base,并不意味着派生类不想使用这些函数。

代码语言:javascript
复制
struct Base
{
   virtual void foo() = 0;
   int x;
};

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

请参见:

  • §12.1/5 (ctor)
  • 第12.8/9节(移动)
  • 12.8/20(副本)
票数 5
EN

Stack Overflow用户

发布于 2014-01-23 14:12:15

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

派生类会在其析构函数中执行任何操作吗?你能确定他们永远不会,即使是当别人接管发展?

拥有一个虚拟析构函数的全部意义不在于确保基类被正确地销毁,这无论如何都会发生。要点是,当使用泛型接口时,调用派生类的析构函数:

代码语言:javascript
复制
struct A {
  virtual ~A() {}
  virtual int f() = 0;
};

class B : public A {
  std::ifstream fh;
public:
  virtual ~B() {}
  virtual int f() { return 42; }
};

std::shared_ptr<A> a = new B;

a超出范围时,为什么关闭ifstream?因为析构函数使用虚拟析构函数删除对象。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21306976

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档