派生类 C++ 中基类受保护成员的访问声明为公共的

Posted

技术标签:

【中文标题】派生类 C++ 中基类受保护成员的访问声明为公共的【英文标题】:Access declaration of a protected member of base class as public in derived class C++ 【发布时间】:2018-05-07 20:44:06 【问题描述】:

当我在基类中声明一个受保护的成员并在派生类中继承为私有时,不允许访问该成员

class base
protected:
int a;
;
class derived : public base

protected:
int b;
public:
derived():base() a=0; b=0;
void show()cout<<"a= "<<a<<"\tb= "<<b;
;
int main ()

derived d;
d.a=10;    //error: 'int base::a' is protected within this context
d.show();

但是当我编写派生类时,要授予“a”的公共访问权限(在基中受保护)

class derived : public base 

protected:
int b;
public:
base::a;
;

int main ()

derived d; 
d.a=20;   // no error 

现在我可以在 main() 中更改 'a' 的值而不会出现任何错误。

我看过c++完整参考书,授予访问权限将恢复访问权限,但不能提高或降低访问状态。

谁能告诉我为什么我能够访问基类的受保护成员,私有继承,然后像派生类的公共变量一样提供公共访问(它不违反封装,即受保护的成员应该恢复为受保护)。 如果我的理解不正确,请指导我

【问题讨论】:

受保护的变量只能在派生类内部访问。受保护变量不是公共变量,可以用作d.a=20; protected 将成员提供给其派生类,但不提供给公众(外部使用),当您公开受保护的成员时,其他人也可以公开使用它。 【参考方案1】:

protected 名副其实。它只是不能保护太多;离public不是很远。

baseaprotected 的那一刻,这个领域的命运就注定了——它现在实际上对世界其他地方开放。您所要做的就是创建一个派生类,访问成员变量并向外部世界公开 - 这是您在编写 base::a 时对 derived 所做的(顺便说一下,您通常在之前添加 using那个)。

毕竟,你甚至可以使用普通函数来做到这一点:

class base 
protected:
    int a;
;

class derived : public base 

protected:
    int b;
public:
    int& GotYou()
    
        return a;
    
;


int main ()

    derived d; 
    d.GotYou() = 20; // no error 

如果您需要保护,请使用private

顺便说一句,下面这行可能会让你对 C++ 的工作方式产生错误的印象:

derived():base() a=0; b=0;

这里发生的是 base 被构造,a 被默认初始化为一个不确定的值,然后b 被默认初始化为一个不确定的值,然后进行了两次分配。我建议对初始化列表进行一些研究。

【讨论】:

感谢您的反馈,使用私有它可以正常工作(当我尝试更改访问权限时出现错误)。注意初始化列表 :)【参考方案2】:

以下链接将为您提供帮助:

Difference between private, public, and protected inheritance

http://www.geeksforgeeks.org/inheritance-in-c/

【讨论】:

以上是关于派生类 C++ 中基类受保护成员的访问声明为公共的的主要内容,如果未能解决你的问题,请参考以下文章

C++ - 在派生类中静态初始化基类受保护的成员变量

详解C++中基类与派生类的转换以及虚基类

无法访问派生类中基类的受保护成员

C++ 派生类访问属性

回顾C++:访问权限控制之 公有保护私有继承用法详解与总结

C++ 派生模板类:访问实例的受保护成员