删除C++ 0x中的虚函数

20 c++ virtual-functions deleted-functions c++11

目前尚不清楚如果我在C++ 0x中删除虚拟方法会发生什么:

 virtual int derive_func() = delete;
Run Code Online (Sandbox Code Playgroud)

这是否意味着这个类,从它继承的所有东西都无法定义/实现该derive_func()方法?或者这是非法/编译错误?

flo*_*wnt 15

http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2326.html#delete A deleted virtual function may not override a non-deleted virtual function and vice-versa. 意味着它非常无用(至少我读过它)唯一有效的用途是:

struct A{
     virtual void b() = delete;
};
struct B:A{
     virtual void b() = delete;
};
Run Code Online (Sandbox Code Playgroud)

这是完全无用的,因为永远不会调用该函数.对于非虚函数,使用更合理

编辑要完全清楚这是唯一可能的关系,孩子可能没有实现,你可能不会删除未删除的继承虚拟.


Quu*_*one 5

flownt是正确的,但我想指出,在最终的C++ 11草案(N3337)中,相应的语言已转移到第10.3节#16:

具有已删除定义的函数不应覆盖没有已删除定义的函数.同样,没有删除定义的函数不得覆盖具有已删除定义的函数.2

(第8.4.3#1节)似乎相当清楚,删除的定义实际上算作一个定义,实际上是一个内联定义,这意味着删除的定义满足10.3#11:

在类中声明的虚函数应该在该类中定义或声明为纯,或者两者都是; 但不需要诊断.2

但是,目前的实施似乎不同意.这是我的测试用例:

struct Base {
    virtual void bar();
    virtual void foo() = delete;
};

void Base::bar() { }  // a definition of the first non-inline virtual function
int main() { Base b; }
Run Code Online (Sandbox Code Playgroud)
  • Clang产生了一个不可链接的程序:Base::foo在vtable中提到Base.如果你交换的顺序foobar,链接器抱怨说,整个虚函数表丢失(因为锵认为foo是没有定义的非内联函数).我把它作为一个bug提交 ; 我们会看到开发人员的想法.

  • 海湾合作委员会抱怨foo在翻译单元结束时"使用" ,当它创建vtable时; 但它确实正确地标识bar为第一个非内联虚拟成员函数,无论是foo和的顺序bar.