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

news/2024/7/8 5:09:08

目的: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://www.niftyadmin.cn/n/3242414.html

相关文章

思想调试:为什么4核CPU上只有一个核在工作?

在一个内部的邮件列表里&#xff0c;有人问了这样一个问题&#xff1a;为什么我这4核CPU的电脑上&#xff0c;看起来只有一个核在工作&#xff0c;其他三个核好像都处于空闲状态&#xff1f;如果使用任务管理器设置每个进程的亲缘性(Affinity)设置为4核&#xff0c;则电脑应该会…

实训C++语言设计——STL链表、栈类、队列

目的&#xff1a;了解了链表的定义与实现,学会了其使用方法;了解了栈类的定义和实现,学会了其使用方法;了解了队列的定义和实现,学会其使用方式;了解了c标准模板库STL的使用方式. 内容 程序&#xff1a;//Lab9_2.cpp //linkedlist.h#include<malloc.h>#ifndef LI…

实训C++语言设计——数组元素的排序查找

掌握了对数组元素的排序的方法,学会了对数组元素的查找的方法,还学习到了C库实现查找和排序. 程序&#xff1a;//Lab10_2.cpp#include<iostream>#include<algorithm>using namespace std; void displayArray(int a[],int n){ cout<<endl<<"…

Visual Studio新功能:针对Linux平台的新版SSH终端

在最新版本的Visual Studio 2022 预览版里&#xff0c;用户可以通过一项新的集成化的终端来从Windows中访问目标开发平台。这次更新的终端还包含了一个交互式的SSH外壳。用户可以通过Visual Studio中的[视图 -> 终端]来打开它&#xff0c;如下图所示&#xff1a; 现在&#…

实训C++语言设计——文件和流

熟悉流类库中常用的类及其成员函数的用法,学习到了标准的输入输出及其格式的控制,学习到了文件的应用方式,有二进制文件和文本文件. 算法&#xff1a;无方法&#xff1a;无 程序&#xff1a;//Lab11_1.cpp#include<fstream>using namespace std;#define D(a) T<<…

实训C++语言设计——异常处理

目的&#xff1a;正确理解c的异常处理机制 学习异常处理的定义及执行过程 内容&#xff1a;定义一个异常类CException &#xff0c;有成员函数Reason()&#xff0c;用来显示异常的类型&#xff0c;在子函数中触发异常&#xff0c;在主程序中处理异常&#xff0c;…

Visual Studio2010 获取时间戳c++

最近再弄时间戳&#xff0c;发现python的java的时间戳都有&#xff0c;但是唯独c的没有 网上的看了也不是真正的时间戳&#xff0c;后来研究了代码找到了系统时间戳的地方 通过调试不断跳到所需要的地方之后&#xff08;下图&#xff09;&#xff0c;找到了正在获取时间戳的函…

Android Camera2 —CameraManager API详解

一、CameraManager类概述 CameraManager是用于检测、表征和连接到 CameraDevices 的系统服务管理器。 CameraManager 是一个负责查询和建立相机连接的系统服务&#xff0c;它的功能不多&#xff0c;这里列出几个 CameraManager 的关键功能&#xff1a; 1&#xff09;、将相机…