#include <iostream>
using namespace std;
class student
{
public:
void get_value()
{
cin >> num >> name >> sex;
}
void display()
{
cout << "num:" << num << endl;
cout << "name:" << name << endl;
cout << "sex:" << sex << endl;
}
protected:
int num;
char name[10];
char sex;
};
class student1:public student
{
public:
void get_value_1();
void display1();
private:
int age;
char addr[30];
};
void student1::get_value_1()
{
get_value();
cin >> age >> addr;
}
void student1::display1()
{
cout << "num:" << num << endl;
cout << "name:" << name << endl; //直接引用基类的保护成员
cout << "sex:" << sex << endl;
cout << "age:" << age << endl;
cout << "address:" << addr << endl;
}
class student2:public student1
{
public:
void display2()
{
cout << num << endl;
}
};
int main()
{
student1 stud1;
stud1.get_value_1();
stud1.display1();
student2 stud2;
stud2.display2();
cout << "Hello world!" << endl;
return 0;
}
输入:
101 John M 19 Beijing
输出:
101
John
M
19
Beijing
0
分析:
如果派生类共有继承积累,那么派生类中继承基类的公有成员与保护成员(声明了这样的类型,如int char char),但如果基类建立了一个对象,而派生类建立一个对象,那么派生类对象中数据不是共享基类对象中的数据,因为不同对象对应不同的内存空间。这就解释了最后输出的num是0,因为在stud2这个对象中,num没有初始化,而刚好存num的空间的值为0,所以输出为0而不是基类中的101。
另一些有关继承的结论:
对于保护继承,其基类的公有成员在其派生类中会自动转换成保护成员。
对于保护继承,其派生类定义中可以调用基类保护成员,但在派生类对象中无法直接调用基类保护成员,还有其基类对象也不能直接访问其保护成员数据。