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