实验目的
●掌握派生类的声明方法和派生类构造函数的定义方法
●掌握不同方式下,基类成员在派生类中的访问属性和访问规则
派生类声明方法与构造函数定义:
(1)派生类声明的一般格式:
Class 派生类名:[继承方式] 基类名{
派生类新增的数据成员和成员函数
};
如果不显式地给出继承方式关键字,系统默认为私有继承(private)。
(2)派生类构造函数定义的一般格式:
派生类名(参数总表):积累名(参数表)
{
派生类新增数据成员的初始化语句
}
而在创建派生类对象时,首先执行基类的构造函数,随后再执行派生类的构造函数:当撤销派生类对象时,则先执行派生类的析构函数,随后再执行基类的析构函数。
给定下列程序:
#include<iostream>
using namespace std;
class Base {
public:
void setx(int i) {
x = i;
}
int getx() {
return x;
}
public:
int x;
};
class Derived :public Base {
public:
void sety(int i) {
y = i;
}
int gety() {
return y;
}
void show() {
cout << "Base::x=" << x << endl;
}
public:
int y;
};
int main() {
Derived bb;
bb.setx(16);
bb.sety(25);
bb.show();
cout << "Base::x=" << bb.x << endl;
cout << "Derived::y=" << bb.y << endl;
cout << "Base::x=" << bb.getx() << endl;
cout << "Derived::y=" << bb.gety() << endl;
return 0;
}
这时输出结果为:
此时基类中所有成员都为公有成员,且派生类为公有继承。由下表可知:
即在公有继承中,基类中的公有成员,能够被派生类内部访问,也能被派生类对象访问,就导致了输出以上结果。
派生类中的访问属性和访问规则
而在私有继承和保护继承中,其访问规则如下:
这里的内部访问指的是:由派生类中新增的成员函数对基类继承来的成员的访问
对象访问指的是:在派生类外部,通过派生类的对象对从基类继承来的成员的访问
总的来说,在基类中的属性,继承到派生类了之后,其的属性是从严的。
可以归纳出一下几点:
(1)基类中的私有成员。
无论哪种继承方式,基类中的私有成员不允许派生类继承,即在派生类中不可直接访问。
(2)基类中的公有成员。
当类的继承方式为公有继承时,基类中所有公有成员在派生类中仍以公有成员的身份出现。
当类的继承方式为私有继承时,基类中所有公有成员在派生类中都以私有成员的身份出现。
当类的继承方式为保护继承时,基类中所有公有成员在派生类中都以保护成员的身份出现。
(3)基类中的保护成员。
当类的继承方式为公有继承时,基类中所有保护成员在派生类中仍以保护成员的身份出现。
当类的继承方式为私有继承时,基类中所有保护成员在派生类中都以私有成员的身份出现。
当类的继承方式为保护继承时,基类中所有保护成员在派生类中仍以保护成员的身份出现。
实验总结:
(1)继承是新的类从已有类那里得到的已有的特性,其包含了已有类的特征,同时也可以加入自己的新特性。
(2)派生类对基类成员访问规则会受到继承方式影响,需要牢记的是派生的属性是从严(派生方式,基类属性)。且不管是哪种继承方式,基类中的私有成员在派生类中是不可以直接访问的。这样也很符合C++的语言特性,对数据的保护性。