实验四
观察验证实验
#include <iostream> #include <typeinfo> class Graph { public: void draw() { std::cout << "Graph::draw() : just as an interface\n"; } }; class Rectangle : public Graph { public: void draw() { std::cout << "Rectangle::draw(): programs of draw arectangle\n"; } }; class Circle : public Graph { public: void draw() { std::cout << "Circle::draw(): programs of draw acircle\n"; } }; void fun(Graph *ptr) { std::cout << "pointer type: " << typeid(ptr).name() << "\n"; std::cout << "RTTI type: " << typeid(*ptr).name() << "\n"; ptr -> draw(); } int main() { Graph g1; Rectangle r1; Circle c1; g1.draw(); r1.draw(); c1.draw(); std::cout << "\n"; r1.Graph::draw(); c1.Graph::draw(); std::cout << "\n"; fun(&g1); fun(&r1); fun(&c1); }

在基类的成员函数前加virtual关键字(运行截图如下:)

conclusion:
1.同名覆盖原则:当基类与派生类出现同名成员函数时,根据同名覆盖原则,内层标识符隐藏了外层标识符,对象访问的是各个派生类的同名成员函数,所有基类同名成员函数被隐藏(包括重载函数)。
2.如果使用二元作用域分辨符
对象.类名::函数名(参数)
可以访问特定类的成员函数
3.类型兼容原则:
任何需要基类的对象的地方,都可以使用公有派生类对象代替(可使用基类继承的成员)
程序中,fun(&b1),把公有派生类的对象地址赋值给了基类类型的指针(注意:只能访问继承下来的基类成员)
4.在基类成员函数前加virtual,构成虚函数,体现多态性。
通过基类类型的指针,访问正在指向的对象成员函数。
车辆信息管理
battery.hpp
#include<iostream> using namespace std; class Battery{ private: int capacity; public: Battery(int capacity0=70):capacity(capacity0){} int get_capacity() { return capacity; } };
car.hpp
#include<iostream> #include<string> using namespace std; class Car{ private: string maker,model; int year,odometers; public: Car(string maker0,string model0,int year0,int odometers0=0):maker{maker0},model{model0},year{year0},odometers{odometers0}{} void info(); void update_odometers(int m); }; void Car::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 Car::update_odometers(int m) { if(m<odometers) { cout<<"更新数值有误!"<<endl; } else{ odometers=m; } }
electricCar,hpp
#include<iostream> #include<string> #include "Car.hpp" #include "battery.hpp" using namespace std; class ElectricCar:public Car{ private: Battery battery; public: ElectricCar(string maker0,string model0,int year0,int capacity=70):Car(maker0,model0,year0),battery(capacity) {} void inf0() { Car::info(); cout<<":\t"<<battery.get_capacity()<<endl; } };
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
#include<iostream> #include<string> using namespace std; class MachinePets{ private: string nickname; public: MachinePets(const string s):nickname(s){} string get_nickname()const {return nickname;} virtual string talk() {}; }; class PetCats:public MachinePets{ public: PetsCats(string s):MachinePets(s) {} string talk() { return "miao wu~"; } }; class PetDogs:public MachinePets{ public: PetsDogs(string s):MachinePets(s) {} string talk() { return "wang wang~"; } };
main.cpp
#include<iostream> #include<string> #include "pests.hpp" using namespace std; void play(MachinePets *ptr) { cout<<ptr->get_nickname()<<" says "<<ptr->talk()<<endl; } int main() { PetCats cat("miku"); PetDogs dog("da huang"); play(&cat); play(&dog); }
运行截图


浙公网安备 33010602011771号