一、实验目的
1. 掌握派生类的声明方法和派生类构造函数的定义方法。
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;
}
将基类 Base 中数据成员 x 的访问权限改为 private 时,会出现哪些错误,为什么?
将基类 Base 中数据成员×的访问权限改为 protected 时,会出现哪些错误,为什么?
在原程序的基础上,将派生类Derived 的继承方式改为 private 时,会出现哪些错误,为什么?
在原程序的基础上,将派生类 Derived 的继承方式改为 protected 时,会出现哪些错误,为什么?
1. 28和38行无法访问x,因为x的访问权限改为private时,派生类也无法直接继承和访问基类的x。
2. 38行的bb.x出现错误,因为x的访问权限改为protected时,派生类的对象无法直接访问x。
3. 35行的bb.setx()、38行的bb.x、40行的bb.gety()出现错误,因为继承方式变为私有继承后,对象无法直接访问类中的私有函数及变量。
4. 35行的bb.setx()、38行的bb.x、40行的bb.gety()出现错误,因为继承方式变为保护继承后,对象无法直接访问基类中的保护函数及变量。
三、心得体会
声明派生类的一般形式为
class 派生类名:[继承方式] 基类名{派生类新增加的成员};
继承方式包括: public (公用的),private (私有的)和protected(受保护的),如果不写,则默认为private(私有的)。构造函数和析构函数是不能从基类继承的。 不同的继承方式决定了基类成员在派生类中的访问属性。
通过实验我们熟悉了派生类的定义方法和派生类构造函数的定义方法,明白了在不同继承方式的情况下,基类成员在派生类中的访问权限。