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

时间:2010-10-11 21:25:28

标签: c++ c++11 virtual-functions deleted-functions

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

 virtual int derive_func() = delete;

这是否意味着此类,从中继承的所有内容都无法定义/实现derive_func()方法?或者这是非法/编译错误?

2 个答案:

答案 0 :(得分: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;
};

这完全没用,因为永远不能调用该函数。对于非虚函数,使用更合理

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

答案 1 :(得分:5)

flownt got it right,但我想指出,在最终的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; }
  • Clang生成一个不可链接的程序:Base::foo的vtable中提到了Base。如果你交换foobar的顺序,链接器会抱怨缺少整个vtable(因为Clang认为foo是一个没有定义的非内联函数)。 I filed this as a bug;我们会看到开发人员的想法。

  • 海湾合作委员会抱怨"使用"翻译单元末尾的foo,当它创建vtable时;但它确实正确地将bar标识为第一个非内联虚拟成员函数,无论foobar的顺序如何。