C++ 为什么当我从“母亲”类继承时,当访问说明符设置为PRIVATE时,我不能在“孙女”类中创建“母亲”类对象?

C++ 为什么当我从“母亲”类继承时,当访问说明符设置为PRIVATE时,我不能在“孙女”类中创建“母亲”类对象?,c++,class,inheritance,C++,Class,Inheritance,若孙女继承的类女儿继承自类母亲,且访问说明符设置为PRIVATE,那个么为什么类母亲不能从类孙女访问?我不能创建对象或指针。为什么?这种行为背后的逻辑是什么?如果我在孙女类中使用母亲对象,会有什么问题?并且,连接到最后一个问题,为什么当访问说明符设置为PUBLIC或PROTECTED时,类女儿继承自类母亲,我可以在孙女类中创建母亲对象?这些问题难道我没有想到吗 #include <iostream> #include <stdio.h> using namespace

若孙女继承的类女儿继承自类母亲,且访问说明符设置为PRIVATE,那个么为什么类母亲不能从类孙女访问?我不能创建对象或指针。为什么?这种行为背后的逻辑是什么?如果我在孙女类中使用母亲对象,会有什么问题?并且,连接到最后一个问题,为什么当访问说明符设置为PUBLIC或PROTECTED时,类女儿继承自类母亲,我可以在孙女类中创建母亲对象?这些问题难道我没有想到吗

#include <iostream>
#include <stdio.h>

using namespace std;

class mother
{
    public:
        mother(){};
};

class daughter : private mother
{
    public:
        daughter(){};
};

class granddaughter : public daughter
{ 
    public:
        granddaughter(){}; // ERROR
        mother* mother; // ERROR
};


int main(void){return 0;}
您可以创建母指针和实例。但是,由于名称解析规则,母亲typename将引用私有基类。为了避免这种情况,可以使用完全限定的类型名::mother将该类型称为非基类型:

class granddaughter : public daughter
{ 
    public:
        ::mother* mother; // NO ERROR
};
您可以创建母指针和实例。但是,由于名称解析规则,母亲typename将引用私有基类。为了避免这种情况,可以使用完全限定的类型名::mother将该类型称为非基类型:

class granddaughter : public daughter
{ 
    public:
        ::mother* mother; // NO ERROR
};
因此,当您在课堂上使用“母亲”“孙女”这个名称时,会出现如下错误:

test.cpp:22:9: fatal error: 'mother' is a private member of 'mother'
        mother* mother; // ERROR
        ^
在C++中,可以使用它的类名引用基本对象。编译器将此查找优先于从全局范围查找类。由于该特定基类是私有的,因此会出现错误

要解决此问题,请使用作用域解析运算符::强制编译器从全局作用域进行查找:

class granddaughter : public daughter
{
    public:
        granddaughter(){};                                                                                                                         
    ::mother* mother;                                                                                                                             

};
因此,当您在课堂上使用“母亲”“孙女”这个名称时,会出现如下错误:

test.cpp:22:9: fatal error: 'mother' is a private member of 'mother'
        mother* mother; // ERROR
        ^
在C++中,可以使用它的类名引用基本对象。编译器将此查找优先于从全局范围查找类。由于该特定基类是私有的,因此会出现错误

要解决此问题,请使用作用域解析运算符::强制编译器从全局作用域进行查找:

class granddaughter : public daughter
{
    public:
        granddaughter(){};                                                                                                                         
    ::mother* mother;                                                                                                                             

};

这样继承是没有意义的。最好让班上的人互相指指点点。你的这种设置方式让每个孙女都既是女儿又是母亲?对吧?那是个糟糕的课堂设计。母亲、女儿和孙女都是同一类型的人。女儿是孙女的母亲。姐妹们呢?父子关系应该表示为指向母对象和子对象列表的指针。这个问题很有趣,没有人应该真正关心设计,因为设计完美地说明了这个问题。不要看类设计。我知道这不好…就是一个例子。我想了解这种行为,这样继承是没有意义的。最好让班上的人互相指指点点。你的这种设置方式让每个孙女都既是女儿又是母亲?对吧?那是个糟糕的课堂设计。母亲、女儿和孙女都是同一类型的人。女儿是孙女的母亲。姐妹们呢?父子关系应该表示为指向母对象和子对象列表的指针。这个问题很有趣,没有人应该真正关心设计,因为设计完美地说明了这个问题。不要看类设计。我知道这不好…就是一个例子。我想了解这种行为。告诉您的孩子不要按我的方式走。告诉您的孩子不要按我的方式走。您预计会发生什么冲突?我以为我最初收到一个编译错误,因为数据成员名为母亲。然而,再次访问时,我发现我错了。我将更新帖子以反映这一点。谢谢你指出!您预计会发生什么冲突?我想我最初收到一个编译错误,因为数据成员名为mother。然而,再次访问时,我发现我错了。我将更新帖子以反映这一点。谢谢你指出!