201983290531 唐乾凯 面向对象程序设计实验4
task2运行结果为:
总结:
(1)同名覆盖原则:子类和父类的名字必须相同,不然不叫覆盖。如果覆盖类容不报错,说明已经实现。方法的覆盖,这时子类和父类的名字必须相同。
(2)二元作用域在不同的地方有不同的含义,如果成员函数中定义了类与域中的变量同名的变量,则类域中的变量被块作用域中的变量隐藏。这时可以在变量名前加类名和作用域运算符访问这种隐藏变量。
(3)类型兼容原则是指在需要基类对象的任何地方,都可以使用公有派生类的对象来替代。
加了virtual后RTTI type发生了改变。
task3.
Battery.h
#ifndef BATTERY_HPP #define BATTERY_HPP #include<iostream> using namespace std; class Battery{ private: int capacity; public: ~Battery() { } Battery() { capacity=70; } int get_capacity() { return capacity; } }; #endif
Car.h
#ifndef CAR_HPP #define CAR_HPP #include<iostream> using namespace std; class Car { public: string maker; string model; int year; int odometers; ~Car() { } Car(string car_maker,string car_model,int car_year) { maker=car_maker; model=car_model; year=car_year; odometers=0; } void info() { cout<<"car-information-list"<<endl; cout<<"maker: "<<maker<<endl; cout<<"model: "<<model<<endl; cout<<"year: "<<year<<endl; cout<<"odometers: "<<odometers<<endl; } void update_odometers(int n) { if(n<odometers) { cout<<"data error\n"; } else { odometers=n; } } }; #endif
Electric.h
#ifndef ELECTRICCAR #define ELECTRICCAR #include<iostream> #include "Car.h" #include "Battery.h" using namespace std; class ElectricCar:public Car { private: Battery battery; public: ~ElectricCar() { } ElectricCar(string car_maker,string car_model,int car_year):Car(car_maker,car_model,car_year) { maker=car_maker; model=car_model; year=car_year; odometers=0; } void info() { cout<<"car-information-list"<<endl; cout<<"maker: "<<maker<<endl; cout<<"model: "<<model<<endl; cout<<"year: "<<year<<endl; cout<<"odometers: "<<odometers<<endl; cout<<"capacity: "<<battery.get_capacity()<<endl; } }; #endif
运行结果为:
pet.h
#ifndef PET_HPP #define PET_HPP #include<iostream> using namespace std; class MachinePets { protected: string nickname; public: ~MachinePets() { } MachinePets(const string s) { nickname = s; } virtual string talk() { string s; s="zizi~"; return s; } string get_nickname() { return nickname; } }; class PetCats:public MachinePets{ public: ~PetCats() { } PetCats(string s):MachinePets(s) { nickname=s; } string talk() { string s; s="miao wu~"; return s; } }; class PetDogs:public MachinePets{ public: ~PetDogs() { } PetDogs(string s):MachinePets(s) { nickname=s; } string talk() { string s; s="wang wang~"; return s; } }; #endif
运行结果为: