从派生类中删除虚函数

2024-03-18

我有一个虚拟基类函数,它永远不应该在特定的派生类中使用。有没有办法“删除”它?我当然可以给它一个空定义,但我宁愿让它尝试使用时抛出编译时错误。 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;
};

迄今为止我找到的在调用时出现编译时错误的最佳解决方案Ds 方法是使用static_assert具有继承自的通用结构false_type。只要没有人调用该方法,该结构就保持未定义状态,并且static_assert不会失败。

如果调用该方法然而,该结构体已定义且其值为 false,因此static_assert fails.

如果该方法没有被调用,但是你尝试在超类的指针上调用它,然后Ds 方法未定义,您会得到一个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(使用前将#替换为@)

从派生类中删除虚函数 的相关文章

随机推荐