c++ - 摆脱错误 C2243

标签 c++ inheritance casting implicit-conversion

是否有可能摆脱 error C2243

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

D d;
B *p = &d;   // conversion from 'D *' to 'B &' exists, but is inaccessible

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

D d;
B *p = (B*)&d;

我不明白为什么通过使 D 类继承自 B protected 而使隐式转换不可访问。

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

class B {};
class D : protected B 
{
 public:
 operator B() {return *this;}
};

但是没有办法。

还有其他解决方案可以避免显式转换吗?

最佳答案

如果你想允许转换,你应该使用公共(public)继承。

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

您应该将非公共(public)继承视为一种组合形式,增加了覆盖方法的可能性。

关于c++ - 摆脱错误 C2243,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1471800/

相关文章:

c++ - 多态QSharedPointer

c++ - 为什么我需要转换算法 remove() 的参数?

c++ - 大型、偶尔拼接列表的数据结构选择

c++ - 通过引用传递整数到 C++ 中的类

java - (Java downcasting) 这个例子我做错了什么?

class - 如何通过扩展自定义小部件来创建新的小部件?

c++ - 链接器因重复符号而失败

C++ 控制台 Conway 的生命游戏更新非常缓慢

c++ - 语法错误 : missing ',' before '<'

go - 来自基本类型分配问题的Golang类型