实验四

观察验证实验

#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);
}
View Code

 

 在基类的成员函数前加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);
}

运行截图

 

posted @ 2021-11-30 22:41  Daisy_iris  阅读(33)  评论(2)    收藏  举报