为什么当我从'mother'类继承,访问说明符设置为PRIVATE时,我无法在'granddaughter'类中创建'mother'类对象?

时间:2017-07-11 22:16:57

标签: c++ class inheritance

为什么班级母亲无法从班级孙女那里进入,如果班级女儿(孙女从哪个继承)继承自班级母亲并将访问说明符设置为私人?我无法创建对象或指针。为什么?这种行为背后的逻辑是什么?如果我在孙女班中使用母亲物品会有什么问题?并且,连接到最后一个问题,为什么如果类女儿从类母亲继承并且访问说明符设置为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;}

2 个答案:

答案 0 :(得分:5)

您可以创建mother指针和实例。但是,由于名称解析规则,mother typename将引用私有基类。要解决这个问题,您可以使用完全限定类型名称::mother将该类型称为非基类:

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

答案 1 :(得分:2)

因此,当您在类mother中使用名称granddaughter时,会出现如下错误:

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;                                                                                                                             

};