摆脱错误C2243

Luc*_*ala 10 c++ inheritance casting implicit-cast

是否有可能摆脱C2243错误

class B {};
class D : protected B {};

D d;
B *p = &d;   // conversion from 'D *' to 'B &' exists, but is inaccessible
Run Code Online (Sandbox Code Playgroud)

我在我的应用程序中遇到此错误,最后我通过进行显式转换设法编译它:

D d;
B *p = (B*)&d;
Run Code Online (Sandbox Code Playgroud)

我无法理解为什么通过使D类继承受B保护而使得隐式转换不可访问.

我试图通过在D类中创建一个运算符B()来避免显式转换,以使转换可访问:

class B {};
class D : protected B 
{
 public:
 operator B() {return *this;}
};
Run Code Online (Sandbox Code Playgroud)

但是没有办法.

任何其他避免显式转换的解决方案?

Pao*_*sco 18

如果要允许转换,则应使用公共继承.

使用受保护或私有继承,您声明派生类型从基类继承的事实是一个不应该从外部可见的细节:这就是您收到该错误的原因.

你应该将非公开继承为与所添加的可能性重写方法组成的形式.


Ara*_*raK 8

因为protectedprivate继承不是is-a关系,它们只是构成的语法糖.您的类可以像这样重写,但是您失去了让编译器b为您定义的便利,并且直接使用b成员而不是明确地引用它:

class D
{
  protected:
  B b;
};
Run Code Online (Sandbox Code Playgroud)

关于你问题的第二点:

operator B() {return *this;}
Run Code Online (Sandbox Code Playgroud)

这条线与BD.D*和B*与B和D完全不同,尽管它们是指向它们的指针!要转换指针,你可以重新解释指针:

B *p = reinterpret_cast<B*>(&d); // TOTALLY WRONG, although it compiles :)
Run Code Online (Sandbox Code Playgroud)

不要做上面的行!我想你可能会给我们更多关于你想要达到的信息.