【发布时间】:2014-08-27 21:25:55
【问题描述】:
我有一个虚拟基类函数,它永远不应该在特定的派生类中使用。有没有办法“删除”它?我当然可以给它一个空定义,但我宁愿尝试使用它会引发编译时错误。 C++11 delete 说明符似乎是我想要的,但是
class B
{
virtual void f();
};
class D : public B
{
virtual void f() = delete; //Error
};
不会编译;至少,gcc 明确不会让我删除具有未删除基本版本的函数。是否有其他方法可以获得相同的功能?
【问题讨论】:
-
这怎么可能?你想
D *d = new D(); static_cast<B *>(d)->f()出现编译器错误吗? -
@BryanChen 如果它被转换为指向基类的指针,那么它应该像指向基类的指针一样——在这种情况下,
D::f仍然会被调用,所以是的。 -
那么在这种情况下你会期待什么行为?
-
@Theolodis 更改了我对 Bryan Chen 问题的回答,暂时忘记了派生类函数在将指针转换为基类后仍会被调用。
-
我认为您误解了
delete关键字的使用。delete关键字不是为了从子类中删除方法,这会破坏继承规则,它应该用于禁用特定调用(例如复制调用或从特定类型的参数调用)。
标签: c++ inheritance c++11 derived-class