任务三
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); }
运行图:
总结:
同名覆盖原则:通过成员调用时,默认调用派生类的成员。若通过指针调用,则调用基类的。