实训C++语言设计——继承与派生

来源:互联网 发布:苹果mac电脑办公软件 编辑:程序博客网 时间:2024/05/21 15:49

目的:1学习定义和使用类的继承关系,定义派生类。
              2熟悉不同继承方式下对基类成员的访问控制。
              3学习利用虚基类解决二义性问题。


内容(算法、程序、步骤和方法):
1.定义一个基类animal,有私有整形成员变量age,构造其派生类dog,在其成员函数SetAge(int n)中直接给age赋值,看会出现什么问题,把改为公有成员变量,观察变化。
   算法:根据要求定义基类和派生类,为了反映变化,在派生类中定义函数PrintAge()来输出值。
   程序:
  #include<iostream.h>
class animal
{
private:
 int age;
};

class dog:public animal
{
public:
void setage(int n){age=n;}
void printage(){cout<<"age="<<age<<endl;}
};

void main()
{
  dog dog1;
  dog1.setage(5);
  dog1.printage ();
}

定义一个基类BaseClass,有整形成员变量Number,构造其派生类DerivedClass,观察构造函数和析构函数的执行情况。
算法:先定义如上所述的基类和派生类,为了显示构造函数和析构函数的执行情况,在这两个函数体内可以输出提示语句。
程序:
#include<iostream.h>
class BaseClass
{
 private:
     int Number;
  public:
     BaseClass(){cout<<"调用基类构造函数!"<<endl;}
     ~BaseClass(){cout<<"调用基类析构函数!"<<endl;}
};

class DerivedClass:public BaseClass
{
 public:
      DerivedClass(){cout<<"调用子类构造函数!"<<endl;}
      ~DerivedClass(){cout<<"调用子类析构函数!"<<endl;}
};

void main()
{
  DerivedClass son;
}

3定义一个车基类,具有等成员变量,等成员函数,由此派生出自行车类和汽车类,自行车类具有高度等成员变量,汽车类具有座位数等成员变量,从自行车类和汽车类派生出摩托车类,在继承过程中观察把车类设为虚基类与不设的区别。
算法:根据题目描述,定义相应的类,为了显示变化,在摩托车类里面可定义一个函数来进行输出。
程序:
#include<iostream.h>
class vehicle
{
protected:
 int MaxSpeed;
 int Weight;
public:
 vehicle(int s,int w){MaxSpeed=s;Weight=w;}
 void SetMaxSpeed(int s){MaxSpeed=s;}
 void SetWeight(int w){Weight=w;}
 void Run(){cout<<"class vehicle is running!"<<endl;}
    void Stop(){cout<<"class vehicle has stopped!"<<endl;}
};

class bicycle:virtual public vehicle
{
protected:
 int Height;
public:
 bicycle(int h,int s,int w):vehicle(s,w)
 {Height=h;}
};

class motorcar:virtual public vehicle
{
protected:
 int SeatNum;
public:
 motorcar(int S,int s,int w):vehicle(s,w)
 {SeatNum=S;}
};

class motorcycle:public bicycle,public motorcar
{

public:
 motorcycle(ints,int w,int h,int S):vehicle(s,w),bicycle(h,s,w),motorcar(S,s,w){}
 void Show()
 {
   cout<<"MaxSpeed:"<<MaxSpeed<<endl;
   cout<<"Weight:"<<Weight<<endl;
   cout<<"Height:"<<Height<<endl;
   cout<<"SeatNum:"<<SeatNum<<endl;
 }
};
void main()
{
 motorcycle mc(150,200,15,3);
 mc.Show();
}

结果及分析:
1此时出现问题如下:
     error C2248: 'age' : cannot access private member declared in class 'animal'
分析:子类不能直接访问父类中的私有成员,把基类中的age改为公有成员后则我问题,执行结果如下:
 

2.执行结果:

分析:程序中先执行基类的构造函数,在调用子类的构造函数,而调用析构函数是则相反,即先调用子类的析构函数,然后调用基类的析构函数。

3执行结果:

如果不把车基类设为虚基类,则程序无发分别出摩托车类中所继承到的成员是继承自自行车类还是汽车类,这样就会出现二义性。

 

http://blog.csdn.net/luozhuang/article/details/2090440

0 0