实验4 继承

  • 实验任务二

source code :

 1 #include <iostream>
 2 #include <typeinfo>
 3 
 4 // definitation of Graph
 5 class Graph
 6 {
 7 public:
 8     void draw() { std::cout << "Graph::draw() : just as an interface\n"; }
 9 };
10 
11 
12 // definition of Rectangle, derived from Graph
13 class Rectangle : public Graph
14 {
15 public:
16     void draw() { std::cout << "Rectangle::draw(): programs of draw a rectangle\n"; }
17 };
18 
19 
20 // definition of Circle, derived from Graph
21 class Circle : public Graph
22 {
23 public:
24     void draw() { std::cout << "Circle::draw(): programs of draw a circle\n"; }
25 };
26 
27 
28 // definitaion of fun(): as a call interface
29 void fun(Graph *ptr)
30 {
31     std::cout << "pointer type: " << typeid(ptr).name() << "\n";
32     std::cout << "RTTI type: " << typeid(*ptr).name() << "\n";
33     ptr -> draw();
34 }
35 
36 // test 
37 int main()
38 {
39     Graph g1;
40     Rectangle r1;
41     Circle c1;
42 
43     // call by object name
44     g1.draw();
45     r1.draw();
46     c1.draw();
47 
48     std::cout << "\n";
49 
50     // call by object name, and using the scope resolution operator::
51     r1.Graph::draw();
52     c1.Graph::draw();
53 
54     std::cout << "\n";
55 
56     // call by pointer to Base class
57     fun(&g1);
58     fun(&r1);
59     fun(&c1);
60 }

 

The Running results :

 

 

 对代码稍作改动,在基类Graph的成员函数draw()前面加一个关键字virtual,重新编译运行程序,再次观察结果,对比一下

 

如果派生类中声明了与基类成员函数同名的新函数,即使函数的参数表不同,从基类继承的同名函数的所有重载形式也都会被隐藏。

  • 实验任务三

source code :

 1 #include"battery.hpp"
 2 #include"car.hpp"
 3 #include<iomanip>
 4 
 5 class ElectricCar:public Car{
 6     public:
 7         ElectricCar(string s1,string s2,int a,int b=0,int ca=70):Car(s1,s2,a,b),battery(ca){};
 8         void info() const {
 9             Car::info();
10             cout<<left<<setw(20)<<"capacity: "<<battery.get_capacity()<<"-kWh"<<endl;
11         }
12     private:
13             Battery battery;    
14 };
 1 #include<iostream>
 2 #include<string>
 3 
 4 using namespace std;
 5 
 6 class Battery{
 7     public:
 8         Battery(int b=70):capacity(b){}; //Battery
 9         int get_capacity() const{return capacity;}
10     private:
11         int capacity;
12 };
 1 #include<iostream>
 2 #include<string>
 3 
 4 #include<iomanip>
 5 
 6 using namespace std;
 7 
 8 class Car{
 9     
10     public:
11         Car(string s1,string s2,int a,int b=0):maker(s1),model(s2),year(a),odometers(b){};
12         void info() const {
13             cout<<left<<setw(20)<<"maker: "<<maker<<endl;
14             cout<<left<<setw(20)<<"model: "<<model<<endl;
15             cout<<left<<setw(20)<<"year: "<<year<<endl;
16             cout<<left<<setw(20)<<"odometers: "<<odometers<<endl;
17         }
18         void update_odometers(int meters){
19             if(meters<odometers){
20                 cout<<"incorrect number! "<<endl;
21             }
22                 
23             else{
24                 odometers=meters;
25             }
26                 
27         }
28     private:
29             string maker;
30             string model;
31             int year, odometers;
32 };

 

The Running results :

 

 

  • 实验任务4

source code :

 1 #include <iostream>
 2 using namespace std;
 3 
 4 class MachinePets{
 5     public:
 6         MachinePets(const string s):nickname(s){
 7         };
 8         string get_nickname() const{return nickname;};
 9         virtual string talk(){
10         };
11         ~MachinePets(){
12         };
13     
14     private:
15         string nickname;
16 };
17 class PetCats:public MachinePets{
18     public:
19         PetCats(const string s):MachinePets(s){
20             
21         };
22         
23         string talk(){
24             return "miao wu~";
25         }
26 };
27 class PetDogs:public MachinePets{
28     public:
29         
30         PetDogs(const string s):MachinePets(s){
31             
32         };
33         string talk(){
34             return "wang wang~";
35         }
36 };

 

The Running results :

 

posted @ 2021-12-01 14:51  枕梦轻和  阅读(28)  评论(1编辑  收藏  举报