实验四

任务三

Battery.hpp

#pragma once
#include<iostream>
using namespace std;
class Battery
{
public:
    Battery(float n=70) :capacity{ n } {}
    float get_capacity() {
        return capacity;
    }
    ~Battery() = default;
private:
    float capacity;
};

Car.hpp

#pragma once
#include<iostream>
using namespace std;

class Car
{
public:
    Car(string m="???", string mo="???", int y=0 ) {
        maker = m;
        model = mo;
        year = y;
        odometers = 0;
    }
    void info() {
        cout << "maker:\t\t" << maker << endl;
        cout << "model:\t\t" << model << endl;
        cout << "year:\t\t" << year << endl;
        cout << "odometers:\t" << odometers << endl;
    }
    void update_odometers(float o) {
        if (o <= odometers) {
            cout << "更新信息有误。" << endl;
        }
        else odometers = o;
    }
    ~Car() = default;
private:
    string maker, model;
    int year;
    float odometers;
};

ElectricCar.hpp

#pragma once
#include<iostream>
#include"Car.hpp"
#include"Battery.hpp"
using namespace std;
class ElectricCar :public Battery, public Car
{
public:

ElectricCar(string m = "???", string mo = "???", int y = 0, float od = 70): Car(m, mo, y), Battery(od){
}
void info() {
Car::info();
cout << "capacity:\t" << get_capacity() << "-KWh" << endl;
}
~ElectricCar() = default;
};

main.cpp

#include <iostream>
#include "electricCar.hpp"
int main()
{
    using namespace std;
    // test class of Car
    Car oldcar("Audi", "a4", 2016);
    cout << "--------oldcar's info--------" << endl;
    oldcar.update_odometers(25000);
    oldcar.info();
    cout << endl;
    // test class of ElectricCar
    ElectricCar newcar("Tesla", "model s", 2016);
    newcar.update_odometers(2500);
    cout << "\n--------newcar's info--------\n";
    newcar.info();
}

运行图:

 

 

 

任务四

pets.hpp

#pragma once
#include<iostream>
#include<string>
using namespace std;
class MachinePets 
{
public:
    MachinePets(const string s) { nickname = s; }
    const string get_nickname() { return nickname; }
    virtual string  talk() { return "a"; }
~MachinePets()=default;
private: string nickname; }; class PetCats:public MachinePets { public: PetCats(const string c) :MachinePets(c){ } string talk() { return "miao wu~"; }
~PetCats()=default; };
class PetDogs:public MachinePets { public: PetDogs(const string s):MachinePets(s){} string talk() { return "wang wang~"; }
~PetDogs()=default; };

main.cpp

#pragma once
#include <iostream>
#include "pets.hpp"
void play(MachinePets* ptr)
{
    std::cout << ptr->get_nickname() << " says " << ptr->talk() <<std::endl;
}
int main()
{
    PetCats cat("miku");
    PetDogs dog("da huang");
    play(&cat);
    play(&dog);
}

运行图:

 

 总结:

同名覆盖原则:通过成员调用时,默认调用派生类的成员。若通过指针调用,则调用基类的。

 

posted @ 2021-11-27 19:54  under_world  阅读(26)  评论(2编辑  收藏  举报