实验4 继承
tsak2.cpp文件源码
#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)在多重继承下,为了访问基类或派生类中同名成员,需要定义虚基类。
car.hpp源代码
#ifndef Car_hpp
#define Car_hpp
#include <iostream>
using namespace std;
class Car {
public:
Car(string maker0, string model0, int year0, int odometers0 = 0) :maker(maker0), model(model0), year(year0), odometers(odometers0) {}
void info()
{
cout << "maker: \t\t\t" << maker << endl;
cout << "model: \t\t\t" << model << endl;
cout << "year: \t\t\t" << year << endl;
cout << "odeometers: \t\t" << odometers << endl;
}
void update_odometers(int odometers0)
{
if (odometers0 < odometers)
{
cout << endl;
cout << "更新数值有误!!!" << endl;
cout << endl;
}
else
odometers = odometers0;
}
private:
string maker;
string model;
int year;
int odometers;
};
#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 E_maker, string E_model, int E_year) :Car(E_maker, E_model, E_year), battery(70) {}
void info()
{
Car::info();//调用基类函数info输出前四项
cout << "capacity: \t\t" << battery.get_capacity() << "-kwh" << endl;
}
private:
Battery battery;
};
#endif
battery.hpp源代码
#ifndef Battery_hpp
#define Battery_hpp
#include <iostream>
using namespace std;
class Battery {
public:
Battery():capacity(70) {};//默认构造函数
Battery(int capacity0) :capacity(capacity0) {}
int get_capacity()
{
return capacity;
}
private:
int capacity;
};
#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>
using namespace std;
class MachinePets {
public:
MachinePets(const string s) :nickname(s) {}
virtual string talk() { return "^^"; }
string get_nickname() const
{
return nickname;
}
private:
string nickname;
};
class PetCats :public MachinePets {
public:
PetCats(const string s) :MachinePets(s) {}
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);
}
测试截图: