Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/136.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 受保护的继承、向上转换和转换运算符_C++_Inheritance_Protected_Explicit Conversion - Fatal编程技术网

C++ 受保护的继承、向上转换和转换运算符

C++ 受保护的继承、向上转换和转换运算符,c++,inheritance,protected,explicit-conversion,C++,Inheritance,Protected,Explicit Conversion,我试图使用受保护的继承来隐藏C风格的结构成员 通过这样做,我的派生类现在能够从struct访问所有内容,同时对程序的其余部分隐藏它,但它有一个代价: 编译器将不再允许我从这个派生类隐式转换到基C样式结构 因此,为了再次启用该功能,我在派生类中添加了一个公共转换运算符。但奇怪的事情来了: 首先,我不能将运算符标记为显式:编译器开始在运算符定义中的结构类型上使用非法存储类。 如果没有explicit关键字,编译器仍然会将转换识别为无法访问,因为它被称为i used static_cast。 有什么想

我试图使用受保护的继承来隐藏C风格的结构成员

通过这样做,我的派生类现在能够从struct访问所有内容,同时对程序的其余部分隐藏它,但它有一个代价: 编译器将不再允许我从这个派生类隐式转换到基C样式结构

因此,为了再次启用该功能,我在派生类中添加了一个公共转换运算符。但奇怪的事情来了:

首先,我不能将运算符标记为显式:编译器开始在运算符定义中的结构类型上使用非法存储类。 如果没有explicit关键字,编译器仍然会将转换识别为无法访问,因为它被称为i used static_cast。 有什么想法吗? 我正在使用VisualStudio2010

代码示例:

struct DataFromC
{
    int a, b, c;
};

class Data : protected DataFromC
{
public:

    explicit operator DataFromC()
    {
        return (DataFromC)(*this);
    }
};

用最少的例子展示你的代码。这是一个糟糕的设计。一方面,您使用受保护的继承来隐藏struct的成员,另一方面,您希望它们仍然可以通过向上转换进行访问。奇怪的尝试修改架构,考虑使用聚合而不是继承。您可能会发现显式显式和转换运算符之间的对比度是启发性的,即如果您想要C++ 11个特性,不要使用2010编译器。因此它不能被视为演员。@Mikhail,呃?转换是转换,转换为非引用类型会产生右值。例如int6.5。我不知道你想说什么