实验四类的继承派生和多态(代码片段)

zuiyankh zuiyankh     2022-12-10     653

关键词:

一、实验内容

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_H

#include<string>
#include<iostream>
using std::string;
using std::ostream;

class Car 
public:
    Car(string maker0, string model0, int year0, int odometer0=0);
    void updateOdometer(int odometerN);
    friend ostream & operator<<(ostream &out, const Car &c);
private:
    string maker;
    string model;
    int year;
    int odometer;
;


#endif
car.h
技术图片
#ifndef ELECTRIC_H
#define ELECTRIC_H

#include"battery.h"
#include"car.h"

class ElectricCar:virtual public Car
public:
    ElectricCar(string maker0,string model0,int year0,int odometer0=0);
    friend ostream & operator<<(ostream &out, const ElectricCar &c);
private:
    Battery battery;
;


#endif
electriccar.h

 

技术图片
#include"battery.h"
#include<iostream>

using std::cout;
using std::endl;

Battery::Battery(int batterySize0 ):batterySize(batterySize0) 


int Battery::getSize()
    return batterySize;
battery.cpp
技术图片
#include"car.h"
#include<iostream>

using std::cout;
using std::endl;

Car::Car(string maker0, string model0, int year0, int odometer0 ) :maker(maker0), model(model0), year(year0), odometer(odometer0) 


void Car::updateOdometer(int odometerN) 
    if (odometerN < odometer) 
        cout << "WRONG DATA!";
        exit(0);
    
    else odometer = odometerN;

ostream & operator<<(ostream &out, const Car &c) 
    cout << "maker:" << c.maker << endl;
    cout << "model:" << c.model << endl;
    cout << "year:" << c.year << endl;
    cout << "odometer:" << c.odometer << endl;
    return out;
car.cpp
技术图片
#include"electriccar.h"
#include<iostream>

using std::cout;
using std::endl;

ElectricCar::ElectricCar(string maker0, string model0, int year0, int odometer0 ):Car(maker0,model0,year0,odometer0) 


ostream & operator<<(ostream &out, const ElectricCar &c) 
    Car a(c);
    cout<<a<<endl;
    Battery m=c.battery;
    cout << "batterySize:" <<m.getSize()<<"-kWh"<< endl;
    return out;
electriccar.cpp
技术图片
#include <iostream>
using namespace std;

#include "car.h"
#include "electriccar.h" 

int main() 
    // 测试Car类 
    Car oldcar("Audi","a4",2016);
    cout << "--------oldcar‘s info--------" << endl;
    oldcar.updateOdometer(25000);
    cout << oldcar << endl;

    // 测试ElectricCar类 
    ElectricCar newcar("Tesla","model s",2016);
    newcar.updateOdometer(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 i);
        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 i)
    return p[i];
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

效果如下:

技术图片

 

二、实验小结

虽然测试出结果,有几点还是不太懂:

  • electriccar.cpp中,Car a(c); 我将ElectricCar类c赋值给Car类a,这是反复试探的结果,虽然意外成功,还是不太理解;
  • 什么时候用&也不是很清楚。不对了,就加上&试试,偶尔可以猜对,却不是理解后的结果。

希望大佬不吝赐教,万分感激。

实验4类的继承派生和多态(代码片段)

实验目的 1.理解类的继承和派生机制2.掌握派生类的定义和使用3.理解和掌握派生类成员的标识和访问中同名覆盖原则、二元作用域分辨符和虚基类的用法4.掌握派生类构造函数和析构函数的定义及调用次序5.理解运算符重载... 查看详情

[实验6]类的继承与多态(代码片段)

一、实验目的1.理解类的继承和派生机制2.掌握派生类的定义和使用3.掌握派生类成员的标识与访问中同名覆盖原则、二元作用域分辨符和虚基类的用法4.掌握派生类构造函数和析构函数的定义及调用次序5.理解运算符重载的目的... 查看详情

实验五类的继承派生和多态(代码片段)

一、验证性实验1.在多层继承中,派生类中出现与基类同名成员时,通过对象名.成员名的方式,访问的成员什么?     对象名.成员名:派生类对象2.通过基类指针访问派生类对象时,基类中成员函数有无关键字... 查看详情

实验五--类的继承派生多态二次练习(代码片段)

实验目的1.理解运行时多态2.掌握虚函数和抽象类实验准备1.概念多态,运行时多态虚函数,纯虚函数,抽象类2.语法和应用虚函数的定义和使用纯虚函数、抽象类的定义和使用实验内容设计并实现一个机器宠物类MachinePets。每个... 查看详情

实验五——类的多态,继承和派生2(代码片段)

Part1:验证型实验1.在派生类函数中,如果是使用对象名.成员名进行访问,则最后运行结果是访问每一个派生类中的成员函数;2.如果是通过指针来进行访问那么只会访问base1当中的成员函数,因为第一个程序里的BASE1并没有虚函... 查看详情

类的继承派生组合菱形的继承多态(代码片段)

类的继承继承是一种新建的类的方式,新建的类成为子类,被继承的类称为父亲继承的特性是:子类会遗传父亲的属性继承是类与类之间的关系使用继承目的,可以减少代码的咒余在python中,父类和子类只有在继承的时候才会产... 查看详情

类的继承菱形继承派生多态(代码片段)

一、类的继承(查找顺序先自己再父类)classParentFoo:def__init__(self,first_name,car,money,house):self.first_name=first_nameself.car=carself.money=moneyself.house=housedefteach(self):print("%s教人"%self.first_nam 查看详情

类的继承和多态(代码片段)

继承1、什么是继承?继承是一种新建类的方式新建的类称之为类或者派生类,父类又可以称之为基类或者超类子类会‘遗传’父类的属性继承是类与类之间的关系,寻找这种关系需要先抽象再继承2、为什么要用继承减少代码冗... 查看详情

面向对象进阶1(代码片段)

目录类的继承什么是继承为什么要继承对象的继承类的查找顺序类的派生派生方法一派生方法二类的组合菱形继承问题类的分类新式类经典类菱形继承问题类的多态与多态性多态多态性多态性的好处类的继承什么是继承继承就是... 查看详情

大话设计模式封装继承多态(代码片段)

...处继承概念那什么是基类和派生类呢?1、基类和派生类的基本概念2、调用基类的构造函数学习继承需记住继承的优点继承的缺点多态概念注意多态的原理虚方法概念虚方法的使用方法重写封装概念每个对象都包含它能进行... 查看详情

bingc(继承)(代码片段)

...对象的赋值转换----赋值兼容规则----继承中的作用域派生类的默认成员函数基类哪些成员被子类继承了多继承菱形继承解决方案:1.明确化2.虚拟继承(用在菱形继承中解决菱形继承中存在的二义性问题)(重)... 查看详情

bingc++(继承)(代码片段)

...对象的赋值转换----赋值兼容规则----继承中的作用域派生类的默认成员函数基类哪些成员被子类继承了多继承菱形继承解决方案:1.明确化2.虚拟继承(用在菱形继承中解决菱形继承中存在的二义性问题)(重)... 查看详情

c#程序设计继承和多态实验

这里是程序设计完全小白一枚……跪求大神帮忙!!实验目的要求见下,回答请帮忙给出完整且可以在VS05及更高版本运行的C#代码,非常感谢!满意的财富值会追加!!(如果可以请顺便看看我的另一个问题……再次跪谢!!继... 查看详情

继承知识总结

...对于基类的私有成员,派生类的成员无法直接访问。如下实验:(可将上述实验中的继承方式变成私有继承)但是会发生报错如下:保护继承在保护继承中,基类的公有成员和保护成员都以保护成员的身份出现在基类中,而基类... 查看详情

通过基类的指针或引用调用虚函数构成多态(代码片段)

...++多态的实现是利用虚函数完成的,派生类对基类的虚函数重写,通过基类的指针或引用调用虚函数来实现多态的特性。本问重点讨论为什么必须是通过基类的指针或引用调用虚函数才能构成多态?我们将按照... 查看详情

虚函数和多态(代码片段)

虚函数和多态-虚函数在类的定义中,前面有virtual类关键字的成员函数就是虚函数classbasevirtualintget();;intbase::get()virtual关键字只用在类定义里的函数声明,写函数体时不用构造函数和静态成员函数不能是虚函数虚函数可以参与多... 查看详情

python继承与多态!(代码片段)

继承继承让我们更加容易实现类的扩展。子类是父类的拓展。classParentClass1:#定义父类1passclassParentClass2:#定义父类2passclassSubClass1(ParentClass1):#单继承,基类是ParentClass1,派生类是SubClasspassclassSubClass2(ParentClass1,ParentClass2):#python支持 查看详情

类的继承与派生(代码片段)

第5章类的继承与派生1类的继承与类的派生继承人们追求代码复用(这是提高软件开发效率的重要手段),将继承和派生用于程序设计方法中,从而有了面向对象程序设计的重要特点。C++对代码复用有很强的支持,继承就是支持代... 查看详情