目前尚不清楚如果我在C ++ 0x中删除虚拟方法会发生什么:
virtual int derive_func() = delete;
这是否意味着此类,从中继承的所有内容都无法定义/实现derive_func()
方法?或者这是非法/编译错误?
答案 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
。如果你交换foo
和bar
的顺序,链接器会抱怨缺少整个vtable(因为Clang认为foo
是一个没有定义的非内联函数)。 I filed this as a bug;我们会看到开发人员的想法。
海湾合作委员会抱怨"使用"翻译单元末尾的foo
,当它创建vtable时;但它确实正确地将bar
标识为第一个非内联虚拟成员函数,无论foo
和bar
的顺序如何。