C++|Protected 成员|访问说明符
访问说明符
到目前为止,我们只使用了public和private访问说明符。
Public成员可以从类外任何地方访问,而private成员的访问仅限于类和友元函数。
正如我们以前所见,使用公共方法访问私有类变量是一个好习惯。
除此之外还有一个访问说明符 - protected。
protected的成员变量或函数与私有成员非常相似,唯一的区别就是 - 可以在派生类中访问它。
class Father {
public:
void sayHellow() {
cout << var;
}
private:
int var=0;
protected:
int someVar;
};
someVar可以被Father类的所有派生类访问,而var则不行。
基类-派生类---》父类-子类
继承的类型
访问说明符也被用来指定继承的类型。
注意,我们使用public来继承Father类:
class Daughter: public Father
继承的类型也支持private和protected
- 公共继承(Public Inheritance):基类的public成员成为派生类的public成员,基类的protected成员成为派生类的protected成员。 基类的private成员永远不能直接从派生类访问,但是可以通过调用基类的public和protected成员来访问。
- 受保护继承(Protected Inheritance):基类的public和protected成员成为派生类的受保护成员。
- 私有继承(Private Inheritance):基类的public和protected成员成为派生类的私有成员。
Public是最常用的继承类型,继承类型默认为Private
在Father类中声明一个protected成员,并从Daughter类的'age'函数中访问它。
class Father {
protected:
int var;
};
class Daughter : public Father {
public:
void age() {
var = 12;
}
};
当继承类时,基类的构造函数和析构函数不会被继承。
但是,当派生类的对象被创建或删除时,它们将被调用。
为了进一步解释这种行为,我们来创建一个包含构造函数和析构函数的示例类:
class Father {
public:
Father()
{
cout <<"Father构造函数"<<endl;
}
~Father()
{
cout <<"Father析构函数"<<endl;
}
};
在main中创建一个对象会产生一下的输出:
int main() {
Father f;
}
/* 输出
Father构造函数
Father析构函数
*/
接下来,让我们创建一个Daughter类,使用它自己的构造函数和析构函数,并使其成为Father的派生类:
class Daughter: public Father {
public:
Daughter()
{
cout <<"Daughter构造函数"<<endl;
}
~Daughter()
{
cout <<"Daughter析构函数"<<endl;
}
};
基于前面几题的基础上,当我们创建一个Daughter对象时会发生什么?(Daughter继承了Father,并且他们都声明了自己的构造函数与析构函数)
int main() {
Daughter f;
}
/*输出
Father 构造函数
Daughter 构造函数
Daughter 析构函数
Father 析构函数
*/
注意,首先调用基类的构造函数,然后调用派生类的构造函数。
当对象被销毁时,派生类的析构函数被调用,然后调用基类的析构函数。
可以理解为,派生类需要它的基类才能工作,这就是为什么基类是首先设置的原因。
概要
- 构造函数 - 首先调用基类的构造函数,然后调用派生类的构造函数。
- 析构函数 - 首先调用派生类的析构函数,然后调用基类的析构函数。
版权声明:
作者:RHZ
链接:https://www.rhzhz.cn/?p=965
来源:RHZ | 用文字记录工作和学习生活
文章版权归作者所有,未经允许请勿转载。
כנסו לאתר