如何定义隐式转换运算符

时间:2013-07-23 13:00:59

标签: c++

我有类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

如何隐式进行投射?

3 个答案:

答案 0 :(得分:2)

您提供的转换运算符已经隐式。您遇到的问题是编译器看到两个不同的转换序列,从Bconst 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;