问题描述
我有一个继承自另一个的类。我不希望这个类的用户不小心在子对象上使用基类函数。显而易见的答案是使继承受保护或私有。
然而,我确实希望从子对象隐式转换到基类。这个转换的默认实现在大多数上下文中是隐藏的,因为它被赋予了受保护/私有状态,并且尝试定义用户转换会抛出警告
const components: any = {
'star-rating': Starrating,'slider-grade': SliderGrade,'default': Textarea
}
const mappingComponents = () => {
return (
questions.map((question:any,index:number) => {
const SurveyComponent = components[question.style]
return <SurveyComponent key={index} />
})
)
}
很公平。这条大道对我关闭,我必须转过来问:有没有办法将默认类型转换重新分类到公共空间,以便隐式转换可以继续存在?
作为我正在努力工作的一个例子:
"converting ‘B’ to a reference to a base class ‘A’ will never use a type conversion operator [-Wclass-conversion]"
遗憾的是,我不能仅仅将基类中的违规函数声明为受保护的:如果用户显式转换为该基类,我希望它们可用。在我的特定情况下,B 不包含任何数据,只是 A 的方便/安全包装器,因此我不需要担心通过允许此转换来切片或以其他方式丢失任何信息。我只是不希望用户将后端 API(当前通过公共继承公开)误认为是对用户更友好的包装器 API 的一部分。
解决方法
我不认为你可以按照你要求的方式做你想做的事情。
我会使用封装而不是继承:
class A {
public:
T func1(); // should be visible via B
void func2(); // should not be visible via B
};
class B { // note: not inheriting from A
A base; // B explicitly defines its "base class sub-object"
public:
// provide access to base class sub-object
operator A&() { return base; }
// provide access to func1
T func1() { return base.func1(); }
};
void use(A &a) { a.func2(); }
int main() {
B b;
b.func1(); // no problem
// b.func2(); // won't work;
use(b); // no problem. Uses our conversion operator
}