实验4 类的继承、派生和多态(1)

实验目的



1. 理解类的继承和派生机制

2. 掌握派生类的定义和使用

3. 理解和掌握派生类成员的标识和访问中同名覆盖原则、二元作用域分辨符和虚基类的用法

4. 掌握派生类构造函数和析构函数的定义及调用次序

5. 理解运算符重载的目的,掌握运算符重载函数的编写方法

实验准备



1. 类的继承和派生

引入继承和派生机制的目的

基本概念:继承、派生、基类、直接基类、间接基类 、派生类

语法 派生类定义的语法格式(单重继承和多重继承)

派生类构造函数及其初始化列表书写形式 派生类成员的标识与访问 同名覆盖指的是什么?

二元作用域分辨符在什么情况下使用? 什么是虚基类?引入虚基类的目的是什么?如何使用?

类的继承和派生 vs. 类的组合

2. 运算符重载

运算符重载的目的

运算符重载的规则和限制

运算符重载函数的语法格式

运算符重载时,重载为成员函数,还是非成员函数(友元、普通函数),需要综合考量哪些因素?

实验结论



1.ElectricCar类

//重载<<时多打了",",已改正

#ifndef BATTERY_H
#define BATTERY_H
class Battery {
public:
    Battery(int nb = 70);
    int showbatterysize();
    void change(int n);
private:
    int batterysize;
};
#endif

battery.h

#include"battery.h"
#include<iostream>
using namespace std;
//构造函数
Battery::Battery(int nb/*=70*/) :batterysize(nb) {}
//返回电池容量
int Battery::showbatterysize() {
    return batterysize;
}
void Battery::change(int n) {
    batterysize = n;
}

battery.cpp

#ifndef CAR_H
#define CAR_H
#include<string>
#include<iostream>
using namespace std;
class Car {
private:
    string maker;
    string model;
    int year;
    long odometer;
public:
    Car(string n1 = "unknown", string n2 = "unknown", int n3 = 2000,long n4=0);
    void flashodo(long a);
    friend ostream & operator<<(ostream &out, const Car &c);
};
#endif

car.h

#include"car.h"
#include<iostream>
#include<string>
using namespace std;
Car::Car(string n1/*="unknown"*/, string n2/*="unknown"*/, int n3/*=2000*/, long n4/*=0*/) :maker(n1), model(n2), year(n3), odometer(n4) {}
void Car::flashodo(long no) {
    if (no < odometer)
        cout << "WARNING!" << endl;
    else
        odometer = no;
}
ostream & operator<<(ostream &out, const Car &c) {
    out << "(" << "maker:" << "," << c.maker << "," << endl << "," << "model:" << "," << c.model << "," << endl << "," << "year:" << "," << c.year << "," << endl << "," << "odometer:" << "," << c.odometer << ")";
    return out;
}

car.cpp

#ifndef ELECTRICCAR_H
#define ELECTRICCAR_H
#include<string>
#include<iostream>
using namespace std;
#include"car.h"
#include"battery.h"
class ElectricCar :public Car {
public:

    ElectricCar(string n1 = "unknown", string n2 = "unknown", int n3 = 2000, long n4 = 0, int nb = 70);
    friend ostream & operator<<(ostream &out, const ElectricCar &c);
private:
    Battery battery;
};
#endif

electricCar.h

#include<string>
#include<string>
#include<iostream>
#include"car.h"
#include"battery.h"
#include"electricCar.h"
using namespace std;
ElectricCar::ElectricCar(string n1/*="unknown"*/, string n2/*="unknown"*/, int n3/*=2000*/, long n4/*=0*/, int nb/*=70*/) :Car(n1, n2, n3, n4) {
    battery.change(nb);
}
ostream & operator<<(ostream &out, const ElectricCar &c) {
    Battery a = c.battery;
    out << "("<< (Car)c <<"," << endl << "," << "batterysize:" << "," << a.showbatterysize() << ")";
    return out;
}

electricCar.cpp

#include<string>
#include<iostream>
#include<cstdlib>
using namespace std;
#include "car.h"
#include "electricCar.h"
int main() {
    // 测试Car类
    Car oldcar("Audi", "a4", 2016);
    cout << "--------oldcar‘s info--------" << endl;
    oldcar.flashodo(25000);
    cout << oldcar << endl;
    // 测试ElectricCar类
    ElectricCar newcar("Tesla", "model s", 2016);
    newcar.flashodo(2500);
    cout << "\n--------newcar‘s info--------\n";
    cout << newcar << endl;
    system("pause");
    return 0;
}

main.cpp

运行截图:

2.arrayint类

#ifndef ARRAY_INT_H
#define ARRAY_INT_H

class ArrayInt{
    public:
        ArrayInt(int n, int value=0);
        ~ArrayInt();
        int &operator[](int a);
        void print();
    private:
        int *p;
        int size;
};

#endif

arrayInt.h

#include "arrayInt.h"
#include <iostream>
#include <cstdlib>
using std::cout;
using std::endl;

ArrayInt::ArrayInt(int n, int value): size(n) {
    p = new int[size];

    if (p == nullptr) {
        cout << "fail to mallocate memory" << endl;
        exit(0);
    } 

    for(int i=0; i<size; i++)
        p[i] = value;
}

ArrayInt::~ArrayInt() {
    delete[] p;
}

void ArrayInt::print() {
    for(int i=0; i<size; i++)
        cout << p[i] << " ";
    cout << endl;
}
int &ArrayInt::operator[](int a)
{
    return p[a];
}

arrayInt.cpp

#include <iostream>
using namespace std;

#include "arrayInt.h"

int main() {
    // 定义动态整型数组对象a,包含2个元素,初始值为0
    ArrayInt a(2);
    a.print();

    // 定义动态整型数组对象b,包含3个元素,初始值为6
    ArrayInt b(3, 6);
    b.print();

    // 通过对象名和下标方式访问并修改对象元素
    b[0] = 2;
    cout << b[0] << endl;
    b.print();

    system("pause");

    return 0;
}

main.cpp

运行截图:

实验结论



1.在写EletricCar类时,出现了无法重载Car类的bug,后来重写了一遍Car类就解决了问题,不知道有大佬可以解释一下吗?

评论:

1.

2.

3.

原文地址:https://www.cnblogs.com/wyf-blogs/p/10891275.html

时间: 2024-11-03 22:11:06

实验4 类的继承、派生和多态(1)的相关文章

实验五--类的继承派生多态二次练习

实验目的 1. 理解运行时多态 2. 掌握虚函数和抽象类 实验准备 1. 概念 多态,运行时多态 虚函数, 纯虚函数, 抽象类 2. 语法和应用 虚函数的定义和使用纯虚函数.抽象类的定义和使用 实验内容 设计并实现一个机器宠物类MachinePets. 每个机器宠物有如下信息:昵称(nickname) 每个机器宠物有如下成员函数: 带参数的构造函数MachinePets(const string s) ,为机器宠物初始化昵称. 纯虚函数string talk()为机器宠物派生类提供宠物叫声的统一

c++ 类的继承派生

作者:张煜 这周上的c++课上老师讲了类的继承和派生,总觉得他讲的相当的不完整. 类的继承是利用已有的类来建立专用类的编程技术.从另一个角度来说,从已有的类(父类)产生一个新的子类,称为类的派生. 继承是面向程序设计中最重要的机制,它支持层次分类的观点.继承使得程序员可以在一个较一般的类的基础上很快地建立一个新类,而不必从零开始设计每个类,在现实世界中,许多实体或概念不是孤立的,它们具有共同的特征,但也有细微的差别,人们使用层次分类的方法来描述这些实体或概念之间的相似点和不同点.如下图:    

c++实验四 类的继承、派生和多态

实验目的 1. 理解类的继承和派生机制 2. 掌握派生类的定义和使用 3. 理解和掌握派生类成员的标识和访问中同名覆盖原则.二元作用域分辨符和虚基类的用法 4. 掌握派生类构造函数和析构函数的定义及调用次序 5. 理解运算符重载的目的,掌握运算符重载函数的编写方法 实验内容 一.ElectricCar类 #ifndef BATTERY_H #define BATTERY_H class Battery { public: Battery(int nb = 70); int showbattery

实验五 类的继承、派生和多态(2)

一.验证性实验 1. 在多层继承中,派生类中出现与基类同名成员时,通过对象名.成员名的方式,访问的成员什么? 对象名.成员名:派生类对象 2. 通过基类指针访问派生类对象时,基类中成员函数有无关键字virtual,访问的成员分别是什么? 基类指针:有关键字时访问派生类,无关键字访问基类对象 二.编程练习 1.设计并实现一个机器宠物类MachinePets #include<iostream> #include<string> using namespace std; class M

实验四 类的继承、派生和多态(1)

一.实验内容 1.车辆基本信息管理 基于Car类派生出ElectricCar类.派生类ElectricCar中新增数据成员Battery类对象. #ifndef BATTERY_H #define BATTERY_H class Battery { public: Battery(int batterySize0=70); int getSize(); private: int batterySize; }; #endif battery.h #ifndef CAR_H #define CAR_

实验6 类的继承和多态

四.实验结论 1.实验内容1 Base.h #ifndef Base_h #define Base_h using namespace std; class Base { public: Base (int m0 ,int n0):m(m0),n(n0){} int add (){return m+n;}; int getm() const {return m;}; int getn() const {return n;}; private: int m, n; }; #endif /*Base

实验三 类的继承和多态性

1.(1)编写一个接口ShapePara,要求: 接口中的方法: int getArea():获得图形的面积.int getCircumference():获得图形的周长 (2)编写一个圆类Circle,要求:圆类Circle实现接口ShapePara. 该类包含有成员变量: radius:public 修饰的double类型radius,表示圆的半径. x:private修饰的double型变量x,表示圆心的横坐标. y:protected修饰的double型变量y,表示圆心的纵坐标. 包含的

实验:类的继承

1 class SchoolMember: 2 def __init__(self,name,age): 3 self.name = name 4 self.age = age 5 print 'Initialized SchoolMember:%s'%self.name 6 7 def tell(self): 8 print 'Name:%s Age:%s'%(self.name,self.age) 9 10 class Teacher(SchoolMember): 11 def __init

实验6:类的继承和多态

南京信息工程大学实验报告 实验名称 类的继承和多态 实验日期 2018-5-29 得分 指导教师 耿学华 系 计软院 专业 计嵌+软嵌 年级 2017 级 班次 (1) 姓名 施昊阳 学号 20161334026 一.实验目的 理解类的继承和派生机制 掌握派生类的定义和使用 掌握派生类成员的标识与访问中同名覆盖原则.二元作用域分辨符和虚基类的用法 掌握派生类构造函数和析构函数的定义及调用次序 理解运算符重载的目的,掌握运算符重载函数的编写方法 二.实验准备 类的继承和派生 请结合第 7 章课件和