• 实验四


    任务2

    task2.cpp

    #include <iostream>
    #include <typeinfo>
    
    // definitation 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);
    }

    微调后

    #include <iostream>
    #include <typeinfo>
    
    // definitation of Graph
    class Graph
    {
    public:
        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);
    }

     归纳总结:

    (1)同名覆盖原则:当派生类和基类中有相同成员时,若未强行指明,则通过派生类对象使用的是派生类的中的同名成员。

    (2)二元作用域分辨符:若要通过派生类对象访问基类中被覆盖的同名成员,应使用基类名及作用域分辨符限定。当多个基类存在同名成员时,如果通过派生类对象访问存在二义性,也应使用基类名及作用域分辨符限定。

    (3)类型兼容原则:在需要基类对象的任何地方,都可以使用公有派生类的对象来替代。

    任务3

    battery.hpp

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

    car.hpp

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

    electricCar.hpp

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

    task3.cpp

    #include"ElectricCar.hpp"
    #include <iostream>
    int main()
    {
        using namespace std;
    
        // test class of Car
        Car oldcar("Lamborghini", "Aventador", 2019);
        cout << "--------oldcar's info--------" << endl;
        oldcar.update_odometers(25000);
        oldcar.info();
    
        cout << endl;
    
        // test class of ElectricCar
        ElectricCar newcar("Tesla", "model h", 2030);
        newcar.update_odometers(2888);
        cout << "\n--------newcar's info--------\n";
        newcar.info();
    }

    任务4

    pets.hpp

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

  • 相关阅读:
    HDU 2896 病毒侵袭 (AC自动机)
    HDU 2222 Keywords Search (AC自动机)
    HDU 2457 DNA repair (AC自动机+DP)
    CoFun 1612 单词分组(容斥)
    邓_mysql_面试
    Html5+js测试题(开发版)
    Html5+js测试题【完整版】
    HTML面试
    支付宝+微信=合成二维码
    邓_laravel框架——news
  • 原文地址:https://www.cnblogs.com/ruanfandd/p/15614830.html
Copyright © 2020-2023  润新知