资源描述
实验十一 继承与派生(一)
1、 实验目的
掌握利用单继承和多重继承的方式定义派生类的方法;深刻理解在各种继承方式下构造函数和析构函数的执行顺序;理解和掌握公有继承、私有继承和保护继承对基类成员的访问机制;理解虚基类的概念以及引入虚基类的目的和作用。
2、 实验内容
(1) 将书上例5.1的程序片段补充和改写成一个完整、正确的程序,用公用继承方式。在程序中应包括输入数据的函数,在程序运行时输入num,name,sex,age,addr的值,程序应输出以上5个数据的值。
#include "stdafx.h"
#include <iostream>
#include <string>
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;}
private :
int num;
string name;
char sex;
};
class Student1: public Student
{public:
void get_value_1()
{cin>>age>>addr;}
void display_1()
{
cout<<"age: "<<age<<endl;
cout<<"address: "<<addr<<endl;}
private:
int age;
string addr;
};
int main()
{Student1 stud1;
stud1.get_value();
stud1.get_value_1();
stud1.display();
stud1.display_1();
return 0;
}
(2) 将书上例5.2的程序片段补充和改写成一个完整、正确的程序,用私有继承方式。在程序中应包括输入数据的函数,在程序运行时输入num,name,sex,age,addr的值,程序应输出以上5个数据的值。
#include <iostream>
#include <string>
using namespace std;
class Student
{public:
void display( )
{cout<<"num: "<<num<<endl;
cout<<"name: "<<name<<endl;
cout<<"sex: "<<sex<<endl;}
private :
int num;
string name;
char sex;
};
class Student1: private Student
{public:
void display_1()
{display();
cout<<"age: "<<age<<endl; //引用派生类的私有成员,正确
cout<<"address: "<<addr<<endl;} //引用派生类的私有成员,正确
private:
int age;
string addr;
};
int main()
{Student1 stud1;
stud1.display_1();
return 0;
}
(3) 将书上例5.3的程序修改、补充,写成一个完整、正确的程序,用保护继承方式。在程序中应包括输入数据的函数。
#include <iostream>
#include <string>
using namespace std;
class Student //声明基类
{public: //基类公用成员
void display( );
protected : //基类保护成员
int num;
string name;
char sex;
};
void Student::display( )
{cout<<"num: "<<num<<endl;
cout<<"name: "<<name<<endl;
cout<<"sex: "<<sex<<endl;
}
class Student1: protected Student //用protected继承方式声明一个派生类
{public:
void display1( );
private:
int age;
string addr;
};
void Student1::display1( )
{cout<<"num: "<<num<<endl; //引用基类的保护成员,合法
cout<<"name: "<<name<<endl; //引用基类的保护成员,合法
cout<<"sex: "<<sex<<endl; //引用基类的保护成员,合法
cout<<"age: "<<age<<endl; //引用派生类的私有成员,合法
cout<<"address: "<<addr<<endl; //引用派生类的私有成员,合法
}
int main( )
{Student1 stud1; //stud1是派生类student2的对象
stud1.display1( ); //display是派生类中的公用成员函数
return 0;
}
(4) 有以下程序结构,请分析访问属性。
class A//A为基类
{public:
void f1( );
int i;
protected:
void f2( );
int j;
private:
int k;
};
class B: public A //B为A的公用派生类
{public:
void f3( );
protected:
int m;
private:
int n;
};
class C: public B //C为B的公用派生类
{public:
void f4( );
private:
int p;
};
int main( )
{A a1; //a1是基类A的对象
B b1; //b1是派生类B的对象
C c1; //c1是派生类C的对象
return 0;
}问:
(1) 在main函数中能否用b1.i,b1.j和b1.k引用派生类B对象b1中基类A的成员?I,j,f2可以,k不可以
(2) 派生类B中的成员函数能否调用基类A中的成员函数f1和f2?T
(3) 派生类B中的成员函数能否引用基类A中的数据成员i,j,k? i,j可以,k不可以
(4) 能否在main函数中用c1.i,c1.j,c1.k,c1.m,c1.n,c1.p引用基类A的成员i,j,k,派生类B的成员m,n,以及派生类C的成员p?
(5) 能否在main函数中用c1.f1(),c1.f2(),c1.f3()和c1.f4()调用f1,f2,f3,f4成员函数?T
(6) 派生类C的成员函数f4能否调用基类A中的成员函数f1,f2和派生类中的成员函数f3?T
3、 实验小结
展开阅读全文