假设我有自己构建的类(我不会引用一个例子,因为长度)X,并且在受保护的部分中,有一个类Y(来自外部库我无法修改,并且不能使用该类的继承因为成员定义是隐藏的。)
Y类有大约40个功能。其中20个我不希望用户能够访问或修改,因为它会导致功能损坏(当前在X类中受到保护状态阻止),但是我希望用户能够访问的其他20个功能因此修改Y类(几乎,好像它们有直接访问权减去所谓的'危险'功能)。
如果没有在X类中写出20个与Y类完全相同的函数,是否有更简单,更快捷的方式来授予用户访问20个左右的函数(比如某种函数转发能力等)? / p>
扩展说明:
这有点棘手,因为有一个库函数需要一个Y类(但是不会接受类X,并且人们抱怨我在类之间进行转换)。类X应该为类Y的操作自动化和存储信息,能够返回函数的(const)类Y ,并允许用户修改简单的东西(例如对象的位置) )但不是自动化的东西(图像,图像循环)。
类X是一种类Y类在自动化函数中工作但不允许类X返回类Y(不能引用自身,类Y的修改版本,再次,人们会抱怨我在类之间进行铸造)。
答案 0 :(得分:4)
为什么你不能从班级Y
继承?如果你可以使用它,你可以继承它。
您可以使用非公共继承(可能是私有继承)解决您的问题,然后通过Y
声明从using
解除您想要的功能:
class Y
{
public:
void FunctionIWantToExpose();
void AnotherFunctionIWantToExpose();
void FunctionIDontWantToExpose();
}
class X : private Y
{
public:
using Y::FunctionIWantToExpose;
using Y::AnotherFunctionIWantToExpose;
}
int main()
{
X x;
x.FunctionIWantToExpose(); // This is legal and calls Y::FunctionIWantToExpose()
x.FunctionIDontWantToExpose(); // This will cause a compile error
return 0;
}
编辑:如果您想提供对内部Y
对象的访问权限,可以使用X
中的其他成员函数轻松完成:
const Y& GetY() const
{
return *this;
}
这适用于类X
,因为可以在那里访问基类Y
。另一方面,只返回GetY()
的{{1}}版本是完全不可取的,因为类客户端可以使用它来使用Y&
方法修改X
个对象想阻止。