如何在私有继承中调用父成员
How can a parent members be called in Private Inheritance?
我正在阅读GoF的一本关于设计模式的书-在线链接。
在这本书中,在适配器模式的示例代码部分,我遇到了这个特殊的代码:
class TextView {
public:
TextView();
void GetOrigin(Coord& x, Coord& y) const;
void GetExtent(Coord& width, Coord& height) const;
virtual bool IsEmpty() const;
};
该类TextView
由TextShape
私有继承,如下所示:
class TextShape : public Shape, private TextView {
public:
TextShape();
virtual void BoundingBox(
Point& bottomLeft, Point& topRight
) const;
virtual bool IsEmpty() const;
virtual Manipulator* CreateManipulator() const;
};
然后在这个void TextShape::BoundingBox
函数中如下:
void TextShape::BoundingBox (
Point& bottomLeft, Point& topRight
) const {
Coord bottom, left, width, height;
GetOrigin(bottom, left); //How is this possible? these are privately inherited??
GetExtent(width, height); // from textView class??
bottomLeft = Point(bottom, left);
topRight = Point(bottom + height, left + width);
}
可以看出,函数GetExtent
&GetOrigin
被称为TextShape,而包含这些的类TextView
是私有继承的。
我的理解是,在私有继承中,所有parent class
成员都变得不可访问,那么这个(void TextShape::BoundingBox()
)函数是如何试图访问它的呢?
更新:
感谢大家的回答,我在阅读关于私人继承的文章时,有一个错误的想法。我觉得,它甚至会阻止对任何成员的访问,而实际上它会更改访问说明符,而不是可访问性。非常感谢您澄清:)
在私有继承过程中,父成员对其他所有人都是不可访问的,而不是类本身父类的受保护成员和公共成员在派生类及其友元中仍然可以访问。
示例:
class Base
{
public: int publ;
protected: int prot;
private: int priv;
};
class Derived: private Base
{
friend void g();
void f()
{
priv = 42; //error, priv is private
prot = 42; //OK
publ = 42; //OK
}
};
int main()
{
Derived d;
d.priv = 42; //error
d.prot = 42; //error
d.publ = 42; //error
}
void g()
{
Derived d;
d.priv = 42; //error
d.prot = 42; //OK
d.publ = 42; //OK
}
以下是继承如何影响访问:
-
公共继承使公共基础成员成为公共成员,受保护的成员受到保护,私有基础成员不可访问。
-
受保护的继承使公共和受保护的基成员在派生类中受到保护,并且私有基成员不可访问。
-
私有继承使公共和受保护的基成员在派生类中是私有的,并且私有基成员是不可访问的。
相关文章:
- 为什么使用 "this" 指针调用派生成员函数?
- C++继承 - 为什么调用父方法?
- 不允许运算符 const 参数调用 const 成员函数
- 在运行时有条件地删除类成员或跳过调用该成员对象的构造函数
- 派生类调用父类的方法,该方法调用重写的虚拟方法调用错误的方法
- 在之后仍需要使用源对象时调用父移动分配运算符
- 如何在 c++ 多重继承中调用父非虚函数?
- 如何通过函数指针递归调用类成员函数?
- 禁止子函数调用父级的抽象(或虚拟)函数
- LNK2019 在文件中调用静态成员的方法时出错.cpp
- 为什么我不能像这样在静态成员函数中调用静态成员变量?
- 在C++中实现类似 python "map"函数的问题:调用类成员函数
- 参数的混合值,当我调用指针成员函数时
- 如何调用原子成员函数指针
- 从类C++外部调用指向成员方法的成员指针
- 如何调用此成员模板函数?
- 使用父类中的私有成员调用父构造函数
- 如何在私有继承中调用父成员
- 调用父对象上的成员函数
- 从基/父数组调用子成员