C ++通过重载更改成员函数的访问权限

时间:2014-10-13 13:07:48

标签: c++ c++11 c++14

我的问题与此问题有关:How to publicly inherit from a base class but make some of public methods from the base class private in the derived class?,但我的情况稍微复杂一些,因为我想更改重载/模板函数的访问权限:

template<typename T>
class Base
{
    public:
        void fun(int);         //1
        void fun(float);       //2

        void fun(T);           //3

        template<typename U>   //4
        void fun(U);
};

template<typename T1, typename T2>
class Derived : private Base<T1>
{
    public:
        //change access specifier here for:
        //1 - make fun(int) available 
        //2 - fun(float) is really evil and it should not be accessible!
        //3 - make fun(T1) == Base::fun(T) available
        //4 - make template<typename U> void Base::fun(U) available 
};

我已经尝试过上一个答案的方法来公开一些函数,但是我收到了这个错误:

ISO C++11 does not allow access declarations; use using declarations instead

如何使用using仅为Derived的用户提供所选功能(1,3和4)?

3 个答案:

答案 0 :(得分:6)

正如Armen和Jarod所指出的那样,using将把所有fun带到派生类中。 Jarod虽然有一个好主意:delete邪恶的功能!结合他们的答案,我得到了这个:

template<typename T1, typename T2>
class Derived : private Base<T1>
{
    public:
        using Base<T1>::fun;
        void fun(float) = delete;
};

这正是我原本想要的!

答案 1 :(得分:3)

您可以创建名称为 fun 的所有实体,也可以不使用任何实体。为此,请写下:

public:
     using Base::fun;

答案 2 :(得分:2)

在您的情况下,您必须手动转发using作为一个整体:

template<typename T1, typename T2>
class Derived : private Base<T1>
{
public:
    void fun(int i) { Base<T1>::fun(i); }

    // Don't show void fun(float); so fun(float) will call the template method
    // or forbid fun(float) by deleting the function
    // void fun(float) = delete;

    void fun(T1 t) { Base<T1>::fun(t); }

    template<typename U> void fun(U u) { Base<T1>::fun(u); }
};