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
运行结果为:


浙公网安备 33010602011771号