我有类A,B。B来自A with protected,所以要启用从B到A的隐式转换,我添加了转换操作符,但是在隐式使用它时会出错(当显式使用它时一切正常)。
如何使这段代码有效?
class A
{
public:
int a;
};
class B : protected A {
public:
int b;
operator const A&()const { return *this; }
};
B b;
const A& a = b; // ERROR: error C2243: 'type cast' : conversion from 'const b *' to 'const A &' exists, but is inaccessible
如何隐式进行投射?
答案 0 :(得分:2)
您提供的转换运算符已经隐式。您遇到的问题是编译器看到两个不同的转换序列,从B
到const A&
,派生到基准的引用和用户提供的转换。对转化进行了排序,并且派生到基础的转化被认为比任何用户提供的转化都要好,因此不会选择operator const A&() const
。
公开继承。您正在尝试构建一个复杂的设计,无论如何都没有任何好处。你想通过继承保护获得什么?避免向上倾斜?你为什么试图提供相同的转换?你打算只允许一半的界面(const
部分)吗?那么你没有关注LSP,因为你的派生对象不能用作基础......
答案 1 :(得分:0)
显然,类型转换运算符在B中定义,因此它不适用于类型A的对象。在C ++中,您无法尝试执行的操作。这是因为'this'指针是一个常量指针。
因此,如果您尝试在A的主体中编写以下代码,它将无法工作:
A(B* b)
{
this = b;//error, 'this' pointer is a constant pointer.
}
换句话说,您不能隐式地使类型A的引用引用B类型对象。充其量,您可以尝试重新解释演员,看看它是否有效。
答案 2 :(得分:0)
好的 - 所以我选择了另一种设计 - 使用合成而不是继承。这样我就可以定义一个受保护的实例A
class B {
protected:
A a;
public
operator const A&()const { return a; }
};
B b;
const A& a = b;