0

我有 A、B 类。B 派生自 A 并受保护,因此为了启用从 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

如何使铸造隐式?

4

3 回答 3

2

您提供的转换运算符已经是隐式的。您面临的问题是编译器看到从Btoconst A&的两个不同转换序列,派生到基础引用和您的用户提供的转换。转换有一个排序,派生到基础的转换被认为比任何用户提供的转换更好,所以你operator const A&() const不会被选中。

只需公开继承即可。您正在尝试构建一个没有任何好处的复杂设计。你想通过保护继承获得什么?避免上调?为什么您仍然尝试提供相同的转换?您是否打算只允许一半的接口(const部分)?那么你没有遵循 LSP,因为你的派生对象不能用作基础......

于 2013-07-23T13:17:18.303 回答
0

好的 - 所以我选择了另一种设计 - 使用组合而不是继承。这样我可以定义一个受保护的实例 A

class B {
protected:
  A a;
public
  operator const A&()const { return a; }
};

B b;
const A& a = b;
于 2013-07-23T14:00:05.907 回答
0

显然,类型转换运算符是在 B 中定义的,因此它不适用于 A 类型的对象。您尝试做的事情在 C++ 中是不可能的。这是因为,“this”指针是一个常量指针。因此,如果您尝试在 A 的主体中编写以下代码,它将无法正常工作: A(B* b) { this = b;//error, 'this' pointer is a constant pointer. }

换句话说,您不能隐式地使 A 类型的引用引用 B 类型的对象。充其量,您可以尝试重新解释演员表,看看它是否有效。

于 2013-07-23T13:22:06.773 回答