C++ C++;使用重载更改成员函数的访问权限
我的问题与此相关:,但我的情况稍微复杂一些,因为我想更改重载/模板函数的访问权限:C++ C++;使用重载更改成员函数的访问权限,c++,c++11,c++14,C++,C++11,C++14,我的问题与此相关:,但我的情况稍微复杂一些,因为我想更改重载/模板函数的访问权限: template<typename T> class Base { public: void fun(int); //1 void fun(float); //2 void fun(T); //3 template<typename U> //4
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
};
如何使用
use
仅使所选函数(1、3和4)可供派生的用户使用?您可以使名称为fun的所有实体可用,也可以不使用任何实体。为此,请写:
public:
using Base::fun;
在您的情况下,您必须手动转发,因为使用
作为一个整体工作:
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); }
};
模板
派生类:私有基
{
公众:
void fun(int i){Base::fun(i);}
//不要显示void fun(float);因此fun(float)将调用模板方法
//或通过删除该函数来禁止娱乐(浮动)
//无效乐趣(浮动)=删除;
void-fun(t){Base::fun(t);}
模板void fun(U){Base::fun(U);}
};
正如Armen和Jarod指出的,使用
将给派生类带来所有的乐趣。Jarod有一个好主意:删除
邪恶的功能!结合他们的答案,我得出了以下结论:
template<typename T1, typename T2>
class Derived : private Base<T1>
{
public:
using Base<T1>::fun;
void fun(float) = delete;
};
模板
派生类:私有基
{
公众:
使用Base::乐趣;
无效乐趣(浮动)=删除;
};
这正是我最初想要的 难道不可能在不改变名字的情况下保留邪恶乐趣(浮动)一号的隐私吗?+1当OP想出最好的答案时,我喜欢它!
template<typename T1, typename T2>
class Derived : private Base<T1>
{
public:
using Base<T1>::fun;
void fun(float) = delete;
};