我有一个虚拟基类函数,它永远不应该在特定的派生类中使用。有没有办法“删除”它?我当然可以给它一个空定义,但我宁愿让它尝试使用时抛出编译时错误。 C++11delete
说明符似乎是我想要的,但是
class B
{
virtual void f();
};
class D : public B
{
virtual void f() = delete; //Error
};
不会编译;至少,gcc 明确不允许我删除具有未删除基本版本的函数。还有其他方法可以获得相同的功能吗?
标准不允许这样做,但是您可以使用以下两种解决方法之一来获得类似的行为。
第一个是使用using
to 将方法的可见性更改为私有,从而防止其他人使用它。该解决方案的问题是,在超类的指针上调用该方法不会导致编译错误。
class B
{
public:
virtual void f();
};
class D : public B
{
private:
using B::f;
};
迄今为止我找到的在调用时出现编译时错误的最佳解决方案D
s 方法是使用static_assert
具有继承自的通用结构false_type
。只要没有人调用该方法,该结构就保持未定义状态,并且static_assert
不会失败。
如果调用该方法然而,该结构体已定义且其值为 false,因此static_assert
fails.
如果该方法没有被调用,但是你尝试在超类的指针上调用它,然后D
s 方法未定义,您会得到一个undefined reference
编译错误。
template <typename T>
struct fail : std::false_type
{
};
class B
{
public:
virtual void f()
{
}
};
class D : public B
{
public:
template<typename T = bool>
void
f()
{
static_assert (fail<T>::value, "Do not use!");
}
};
另一个解决方法是使用该方法时抛出异常,但这只会引发run-time.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)