Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/134.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++ - Fatal编程技术网

C++ 第二级子类中的基不可访问

C++ 第二级子类中的基不可访问,c++,C++,为什么我不能成为Grand类型的班级成员 class Grand {}; class Father :private Grand {}; class Son :public Father { Grand g; //This gives error. Class Grand is Inaccessible. }; 这是因为您的Grand被Father继承private隐藏。请尝试使用全局范围: class Son : public Father { ::Grand g; };

为什么我不能成为Grand类型的班级成员

class Grand
{};

class Father :private Grand
{};

class Son :public Father
{
    Grand g; //This gives error. Class Grand is Inaccessible.
};

这是因为您的
Grand
Father
继承
private
隐藏。请尝试使用全局范围:

class Son : public Father {
    ::Grand g;
};

这是因为您的
Grand
Father
继承
private
隐藏。请尝试使用全局范围:

class Son : public Father {
    ::Grand g;
};

因为它会自动将父类“spacename”添加到函数之前,并且父类::Grand::Grand()(构造函数)是私有的

class Grand
{};

class Father :private Grand
{};

class Son :public Father
{
    ::Grand g; 
};

之所以有效,是因为它直接使用类Grand,而不是继承,因为它会在函数之前自动添加父类“spacename”,并且父类::Grand::Grand()(构造函数)是私有的

class Grand
{};

class Father :private Grand
{};

class Son :public Father
{
    ::Grand g; 
};
之所以有效,是因为直接使用类Grand,而不是继承。这将修复它:

class Grand
{};

class Father :private Grand
{};

typedef Grand MyGrand;

class Son :public Father
{
    MyGrand g; // This now compiles successfully
};
问题是像private这样的说明符会影响可访问性,但不会影响可见性。因此,当您说
Grand g
时,编译器首先会遍历继承树,以防您最终解析类似于
Grand::MyType

的内容,这将修复它:

class Grand
{};

class Father :private Grand
{};

typedef Grand MyGrand;

class Son :public Father
{
    MyGrand g; // This now compiles successfully
};

问题是像private这样的说明符会影响可访问性,但不会影响可见性。因此,当您说
Grand g
时,编译器首先会沿着继承树走,以防您最终解析类似
Grand::MyType

的内容,这并不能解释为什么不能创建
Grand
类型的成员。一个根本不从
Grand
继承的类应该能够做到这一点。这并不能解释为什么不能创建
Grand
类型的成员。一个根本不从
Grand
继承的类应该能够做到这一点。如果这一切都发生在命名空间中,那么这个解决方案就不起作用。如果是这样的话,您需要说
TopNS::middles::Grand
或者只说
middles::Grand
(否则您将得到一个“在全局命名空间中找不到”错误)。我的
typedef
解决方案避免了这个问题。事实上,但老实说,我不喜欢你的解决方案的风格(尽管这是一种纯粹的美学判断),我对我的解决方案的美学更满意:-P,有没有一种称为“实际名称空间”的方法,如果不包括课程类别,我同意你的看法,如果你可以说
\u enclosuring\u namespace::Grand
,我认为这样看起来会更好。但是我不知道标准C++中的任何东西。羞愧:-P,这就是为什么我实际上支持了你的文章和评论;如果这一切都发生在命名空间中,则此解决方案不起作用。如果是这样的话,您需要说
TopNS::middles::Grand
或者只说
middles::Grand
(否则您将得到一个“在全局命名空间中找不到”错误)。我的
typedef
解决方案避免了这个问题。事实上,但老实说,我不喜欢你的解决方案的风格(尽管这是一种纯粹的美学判断),我对我的解决方案的美学更满意:-P,有没有一种称为“实际名称空间”的方法,如果不包括课程类别,我同意你的看法,如果你可以说
\u enclosuring\u namespace::Grand
,我认为这样看起来会更好。但是我不知道标准C++中的任何东西。羞愧:-P,这就是为什么我实际上支持了你的文章和评论;