1 #include <iostream>
2 #include <typeinfo>
3
4 // definitation of Graph
5 class Graph
6 {
7 public:
8 virtual 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 return 0;
61 }
62 //本实验通过加virtual关键字可使基类指针调用派生类成员
63
64 // 总结:1、同名覆盖原则:外有内无外有效 。 内有外有(即使只是函数名相同,重载的也包括其中)内有效。 若几个基类有同名成员,则派生类将绝杀。
65 // 2、二元作用域运算符 通过:: 可以访问被隐藏的父级成员,形式:对象名.基类:: ptr->基类::
66 // 3、类型兼容:子转父,子初父&,子p*隐含转父p* attention:兼容后只能使用从基类继承来的成员
![]()
![]()
#ifndef _BATTERY_HPP
#define _BATTERY_HPP
class Battery {
private:
int capacity;
public:
Battery(int cp=70):capacity(cp){}
int get_capacity()const { return capacity; }
};
#endif
#ifndef _CAR_HPP
#define _CAR_HPP
#include<iostream>
#include<string>
#include<iomanip>
using namespace std;
class Car {
private:
string maker,model;
int year, odometers;
public:
Car(string maker,string model,int y,int od=0):maker(maker),model(model),year(y),odometers(od){}
void info()const;
void update_odometers(int od);
};
void Car::info()const {
cout << left << setw(15) << "maker:" << maker << endl
<< setw(15) << "model:" << model << endl
<< setw(15) << "year:" << year << endl
<< setw(15) << "odometers:" << odometers << endl;
}
void Car::update_odometers(int od) {
if (od < 0)cout << "wrong odometers" << endl;
else odometers = od;
}
#endif // !_CAR_HPP
#ifndef _ELECTRICCAR_HPP
#define _ELECTRICCAR_HPP
//#include<string>
#include"Car.hpp"
#include"Battery.hpp"
class ElectricCar :public Car{
private:
Battery battery;
public:
ElectricCar(std::string maker, std::string model, int y, int od=0, int cp=70) :Car(maker, model, y, od), battery(cp) {}
void info()const;
};
void ElectricCar::info()const {
Car::info();
cout << left << setw(15) << "capacity:" << battery.get_capacity() << "-kwh" << endl;
}
#endif // !_ELECTRICCAR_HPP
#include <iostream>
#include "ElectricCar.hpp"
int main()
{
using namespace std;
// test class of Car
Car oldcar("Audi", "q7", 2017);
cout << "--------oldcar's info--------" << endl;
oldcar.update_odometers(13000);
oldcar.info();
cout << endl;
// test class of ElectricCar
ElectricCar newcar("Tesla", "model s", 2015);
newcar.update_odometers(1145);
cout << "\n--------newcar's info--------\n";
newcar.info();
return 0;
}
![]()
#ifndef _PETS_HPP
#define _PETS_HPP
#include<string>
#include<windows.h>
#include<Mmsystem.h>
#pragma comment(lib,"winmm.lib")
using namespace std;
class MachinePets {
private:
string nickName;
public:
MachinePets(const string name):nickName(name){}
virtual string talk() const { return static_cast<string>("a interface "); }
string get_nickName()const;
};
string MachinePets::get_nickName()const {
return nickName;
}
class PetCats:public MachinePets {
public:
PetCats(const string name):MachinePets(name){}
string talk()const;
};
string PetCats::talk()const {
string s = get_nickName() + " says miao wu~";
PlaySound(TEXT("./cat.wav"), NULL, SND_FILENAME| SND_NODEFAULT);
return s;
}
class PetDogs :public MachinePets {
public:
PetDogs(const string name) :MachinePets(name) {}
string talk()const;
};
string PetDogs::talk()const {
string s = get_nickName() + " says wang wang~";
PlaySound(TEXT("./dog.wav"), NULL, SND_FILENAME);
return s;
}
#endif // !_PETS_HPP
#include<iostream>
#include "pets.hpp"
void play(MachinePets* ptr)
{
std::cout << ptr->talk() << std::endl;
}
int main()
{
PetCats cat("miku");
PetDogs dog("da huang");
play(&cat);
//pause
system("pause");
play(&dog);
return 0;
}
![]()
#include<iostream>
#include<map>
#include <string>
#include<stack>
using namespace std;
void fun01() {
map<char, char > dict{ {'0','a'},{'1','b'} ,{'2','c'} ,{'3','d'} ,{'4','e'} ,{'5','f'} ,{'6','g'} ,{'7','h'} ,{'8','i'} ,{'9','j'}};
string num;
cin >> num;
for (auto& i : num)
cout << dict[i];
cout << endl;
}
void fun02(int x,int n = 2) {
if (n == 8)cout <<showbase<< uppercase << oct << x << endl;
else if (n == 16)cout << showbase << uppercase << hex << x << endl;
else {
stack<int> s;
while (x) {
s.push(x % 2);
x /= 2;
}
while (!s.empty()) {
cout << s.top();
s.pop();
}
cout << endl;
}
}