派生类中的成员不可用C++保护的cor

派生类中的成员不可用C++保护的cor,c++,inheritance,C++,Inheritance,如果我声明了一个派生类,其中还包含一个基类型的附加成员,我会得到一个构造函数is protected error test.cpp: $g++test.cpp 如果我将Derived2声明为Base的朋友,错误就会消失。有人能解释一下这里发生了什么吗 TIA。这是因为other_base实际上不是Derived2类的一部分,它是一个单独的对象,遵循公共/受保护/私有成员的正常规则。这是因为other_base实际上不是Derived2类的一部分,它是一个单独的对象,遵循公共/受保护/私有成员的正

如果我声明了一个派生类,其中还包含一个基类型的附加成员,我会得到一个构造函数is protected error

test.cpp:

$g++test.cpp

如果我将Derived2声明为Base的朋友,错误就会消失。有人能解释一下这里发生了什么吗

TIA。

这是因为other_base实际上不是Derived2类的一部分,它是一个单独的对象,遵循公共/受保护/私有成员的正常规则。

这是因为other_base实际上不是Derived2类的一部分,它是一个单独的对象,遵循公共/受保护/私有成员的正常规则。

问题是Derived2包含一个Base实例

受保护成员的可访问性仅在访问其继承的成员的派生类实例的上下文中。它不允许使用受保护的构造函数构造成员

因此,Derived2的构造函数不能构造其他_基,但可以构造它从中继承的基

将Derived2声明为Base的友元可以构造其他的\u Base。

问题是Derived2包含Base的实例

受保护成员的可访问性仅在访问其继承的成员的派生类实例的上下文中。它不允许使用受保护的构造函数构造成员

因此,Derived2的构造函数不能构造其他_基,但可以构造它从中继承的基


将Derived2声明为friend of Base可以构造其他\u Base。

在您的示例中,其他\u Base被视为Derived2类的成员,并且它遵循正常的访问规则。唯一可以调用受保护基本构造函数的地方是Derived2构造函数的初始化列表:

Derived2:Base{}


如果您想使用受保护/私有方法/成员,请使用friend关键字。

在您的示例中,其他\u base被视为您的Derived2类的成员,并且它遵循正常的访问规则。唯一可以调用受保护基本构造函数的地方是Derived2构造函数的初始化列表:

Derived2:Base{}


如果你想使用受保护的/私有的方法/成员使用friend关键字。

当你声明一个对象时,你使用它的公共接口。当你声明一个对象时,你使用它的公共接口。啊,我认为继承更像是友谊,而不是实际上的友谊。谢谢。啊,我认为遗产更像是友谊,而不是真正的友谊。谢谢
class Base { protected: Base() {} };

class Derived1 : public Base
  {
    Derived1()  {}
  };

class Derived2 : public Base
  {
    Derived2()  {}
    Base    other_base;
  };
test.cpp: In constructor ‘Derived2::Derived2()’:
test.cpp:3:25: error: ‘Base::Base()’ is protected
 class Base { protected: Base() {} };
                         ^
test.cpp:12:14: error: within this context
  Derived2()  {}