C++ 中的受保护派生和私有派生有什么区别
What is difference between protected and private derivation in c++
可能的重复项:
C++中私人、公共和受保护继承的区别
在 c++ 中派生为受保护或私有有什么区别? 我无法弄清楚,因为两者都似乎限制了从派生类对象访问基类成员
让我们考虑一个代码示例,该示例显示了使用不同级别的继承允许(或不允许)的内容:
class BaseClass {};
void freeStandingFunction(BaseClass* b);
class DerivedProtected : protected BaseClass
{
DerivedProtected()
{
freeStandingFunction(this); // Allowed
}
};
DerivedProtected
可以把自己传递给freeStandingFunction
,因为它知道它来自BaseClass
。
void freeStandingFunctionUsingDerivedProtected()
{
DerivedProtected nonFriendOfProtected;
freeStandingFunction(&nonFriendOfProtected); // NOT Allowed!
}
非友元(类、函数等)不能将DerivedProtected
传递给freeStandingFunction
,因为继承是受保护的,所以在派生类之外不可见。 私人继承也是如此。
class DerivedFromDerivedProtected : public DerivedProtected
{
DerivedFromDerivedProtected()
{
freeStandingFunction(this); // Allowed
}
};
从DerivedProtected
派生的类可以说它继承自BaseClass
,所以可以将自身传递给freeStandingFunction
。
class DerivedPrivate : private BaseClass
{
DerivedPrivate()
{
freeStandingFunction(this); // Allowed
}
};
DerivedPrivate
类本身知道它派生自BaseClass
,所以可以把自己传递给freeStandingFunction
。
class DerivedFromDerivedPrivate : public DerivedPrivate
{
DerivedFromDerivedPrivate()
{
freeStandingFunction(this); // NOT allowed!
}
};
最后,继承层次结构中更下方的非友元类看不到DerivedPrivate
从BaseClass
继承,因此无法将自身传递给freeStandingFunction
。
使用此矩阵(从此处获取)来确定继承成员的可见性:
继承\成员 | 私人 | 受保护 | 公共--------------------+-----------------+---------------+--------------私人 | 无法访问 | 私人 | 私人受保护 | 无法访问 | 受保护 | 保护公共 | 无法访问 | 受保护 | 公共--------------------+-----------------+---------------+--------------
示例 1:
class A { protected: int a; }
class B : private A {}; // 'a' is private inside B
示例 2:
class A { public: int a; }
class B : protected A {}; // 'a' is protected inside B
例3:
class A { private: int a; }
class B : public A {}; // 'a' is inaccessible outside of A
>private
只允许声明它的类访问它 protected
允许该类和派生/子类像私有类一样访问
我在这个Q中添加了一个关于Inheritance
和Access Specifiers
的非常详细的解释。它解释了所有类型的继承以及访问说明符如何与每种继承一起使用。一定要看看。
:)
基本上,protected
继承比继承private
继承更向下延伸。有关详细信息,请参阅 C++ 常见问题精简版。
- 派生类销毁的最佳实践是什么
- 用常见虚拟函数实现的任意组合来实现派生类的正确方法是什么
- 静态自动 constexpr t = { "red" , "black" , "green" } 是什么类型;派生到?
- 与简单地创建派生类指针相比,将基类绑定到派生类有什么优点?
- 如果基类指针无法访问派生类成员函数,那么多态性有什么方便的呢?
- 调用不属于基类的派生类函数的最佳方法是什么?
- 抽象类的需求是什么?为什么要通过其基类访问派生类方法?在C++
- 有什么方法可以将指针指向孩子范围内的父母(派生)班级
- 施法派生**→基地**有错吗?还有什么选择?
- 如果私有虚拟函数被覆盖为派生类中的公共函数,那么问题是什么
- 在多级继承中派生的虚拟基类会发生什么
- 我做了什么?需要在模板化类的方法中实例化派生类
- 有什么方法可以知道非pure虚拟函数是否已由c 中的派生类实现
- 当我在派生类中添加额外的虚拟功能时,什么是开销
- 派生类型的dynamic_cast "this":什么时候合法?
- 从派生类调用基函数时会发生什么情况
- 派生类对象是否包含基类的私有成员?它在记忆中是什么样子的
- 将派生类对象分配给基类对象时会发生什么(我的意思是对象断言,而不是指针)
- 什么时候不希望执行派生类的解构函数?
- 我们什么时候必须在派生类 c++ 中定义析构函数