实验四 继承

没加virtual之前:

task1.cpp

#include<iostream>
#include<typeinfo>
//definition of Graph
class Graph
{
public:
    void draw() { std::cout << "Graph::draw() : just as an interface\n"; }
};

//definition of Rectangle,derived from Graph
class Rectangle:public Graph
{
public:
    void draw(){ std::cout << "Rectangle::draw(): programs of draw a rectangle\n"; }

};

// definition of Circle, derived from Graph
class Circle : public Graph
{
public:
    void draw() { std::cout << "Circle::draw(): programs of draw a circle\n";}
};

// definitaion of fun(): as a call interface
void fun(Graph *ptr)
{
    std::cout<< "pointer type: " << typeid(ptr).name() << "\n";
    std::cout<< "RTTI type: " << typeid(*ptr).name() << "\n";
    ptr->draw();
}
// test
int main()
{
    Graph g1;
    Rectangle r1;
    Circle c1;

    // call by object name
    g1.draw();
    r1.draw();
    c1.draw();
    
    std::cout<<"\n";
    
    //call by object name,and using the scope resolution operator::
    r1.Graph::draw();
    c1.Graph::draw();
    
    std::cout<<"\n";
    
    //call by pointer to Base class
    fun(&g1);
    fun(&r1);
    fun(&c1);

}

运行结果截图:

 加了virtual之后:

task2.cpp

#include<iostream>
#include<typeinfo>
//definition of Graph
class Graph
{
public:
    //声明时加了关键字virtual 
    virtual void draw() { std::cout << "Graph::draw() : just as an interface\n"; }
};

//definition of Rectangle,derived from Graph
class Rectangle:public Graph
{
public:
    void draw(){ std::cout << "Rectangle::draw(): programs of draw a rectangle\n"; }

};

// definition of Circle, derived from Graph
class Circle : public Graph
{
public:
    void draw() { std::cout << "Circle::draw(): programs of draw a circle\n";}
};

// definitaion of fun(): as a call interface
void fun(Graph *ptr)
{
    std::cout<< "pointer type: " << typeid(ptr).name() << "\n";
    std::cout<< "RTTI type: " << typeid(*ptr).name() << "\n";
    ptr->draw();
}
// test
int main()
{
    Graph g1;
    Rectangle r1;
    Circle c1;

    // call by object name
    g1.draw();
    r1.draw();
    c1.draw();
    
    std::cout<<"\n";
    
    //call by object name,and using the scope resolution operator::
    r1.Graph::draw();
    c1.Graph::draw();
    
    std::cout<<"\n";
    
    //call by pointer to Base class
    fun(&g1);
    fun(&r1);
    fun(&c1);

}

运行结果截图:

 

 

battery.hpp

 

#ifndef BATTETY_HPP
#define BATTETY_HPP
#include<iostream>
using namespace std;
class Battery
{
public:
        Battery(int n=70):capacity(n){}
        int get_capacity (){return capacity;}
private:    
        int capacity;
};
#endif

car.hpp

#ifndef CAR_HPP
#define CAR_HPP
#include<iostream>
#include<string>
#include<cassert> 
using namespace std;
class Car
{
public:
        Car(string a,string b,int  c,int d=0):maker(a),model(b),year(c),odometers(d){}
        void info()
        {
            cout<<"maker:        "<<maker<<endl;
            cout<<"model:        "<<model<<endl;
            cout<<"year:         "<<year<<endl;
            cout<<"odometers:    "<<odometers<<endl;
        }
        void update_odometers(int a)
        {
            assert(a>=odometers);
            odometers=a;
        }
        
private:
        string maker,model;
        int year,odometers;    
};
#endif

electriccar.hpp

#ifndef ELECTRICCAR_HPP
#define ELECTRICCAR_HPP
#include<iostream>
#include<string>
#include "battery.hpp"
#include "car.hpp"
using namespace std;
class ElectricCar:public Car
{
public:
        ElectricCar(string a,string b,int  c,int d=0,int n=70):Car(a,b,c,d),battery(n){}
        void info()
        {
            Car::info();
            cout<<"capacity:     "<<battery.get_capacity()<<"-kwh"<<endl;
        }
private:    
        Battery battery;
};
#endif

task3.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

#ifndef PETS_HPP
#define PETS_HPP
#include<iostream>
#include<string>
using namespace std;
class MachinePets
{
public:    
        MachinePets(const string s):nickname(s){}
        string get_nickname() const{return nickname;}
        virtual string talk(){}
private:
        const string nickname;
};
class PetCats:public MachinePets
{
public:
        PetCats(const string s):MachinePets(s){}
        string talk(){string s="miao wu~";return s;}    
};
class PetDogs:public MachinePets
{
public:
        PetDogs(const string s):MachinePets(s){}
        string talk(){string s="wang wang~";return s;}    
};
#endif

task4.cpp

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

运行结果截图:

 

 

posted @ 2021-11-27 20:59  歧念  阅读(22)  评论(2编辑  收藏  举报