Luc*_*ala 10 c++ inheritance casting implicit-cast
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
如果要允许转换,则应使用公共继承.
使用受保护或私有继承,您声明派生类型从基类继承的事实是一个不应该从外部可见的细节:这就是您收到该错误的原因.
你应该将非公开继承只为与所添加的可能性重写方法组成的形式.
因为protected和private继承不是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)
这条线与B和D.D*和B*与B和D完全不同,尽管它们是指向它们的指针!要转换指针,你可以重新解释指针:
B *p = reinterpret_cast<B*>(&d); // TOTALLY WRONG, although it compiles :)
Run Code Online (Sandbox Code Playgroud)
不要做上面的行!我想你可能会给我们更多关于你想要达到的信息.
| 归档时间: |
|
| 查看次数: |
6272 次 |
| 最近记录: |