C++程序设计实验四 继承

程序源码:
#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);
}
运行结果截图:

归纳总结:
1. 当派生类出现与基类同名成员时:同名覆盖原则(使用派生类所实现的接口),二元作用域分辨符(通过 :: 使用基类所实现的接口)
2. 类型兼容原则:派生类对象可以被当作基类对象使用,但是,当作基类对象使用时,只能使用作为基类的那一部分接口

改动后的代码:
// definitation of Graph
class Graph
{
public:
// 声明时加了关键字virtual
virtual void draw() { std::cout << "Graph::draw() : just as an interface\n"; }
};
运行结果截图:


battery.hpp
#include<iostream> using namespace std; class Battery
{
public:
Battery(int cap=70): capacity(cap) { }
int get_capacity() { return capacity; } private:
int capacity;
};
car.hpp
#include<iostream>
#include<string>
#include<iomanip> using namespace std; class Car
{
public:
Car(string _maker, string _model, int _year) : maker(_maker), model(_model), year(_year) { odometers = 0; }
void info()
{
cout << left << setw(20) << "maker:" << maker << endl;
cout << setw(20) << "model:" << model << endl;
cout << setw(20) << "year:" << year << endl;
cout << setw(20) << "odomerters:" << odometers << endl;
}
void update_odometers(int new_odometers)
{
if (new_odometers < odometers)
{
cout << "\nERROR!! updata odometers small than origin odometers" << endl;
return;
}
odometers = new_odometers;
} protected:
string maker;
string model;
int year;
int odometers;
};
electricCar.hpp
#include<iostream>
#include<string>
#include<iomanip>
#include "car.hpp"
#include "battery.hpp" using namespace std; class ElectricCar : public Car
{
public:
ElectricCar(string _maker, string _model, int _year, Battery _battery=70) : Car(_maker, _model, _year), battery(_battery) { }
void info()
{
cout << left << setw(20) << "maker:" << maker << endl;
cout << setw(20) << "model:" << model << endl;
cout << setw(20) << "year:" << year << endl;
cout << setw(20) << "odomerters:" << odometers << endl;
cout << setw(20) << "capacity:" << battery.get_capacity() << "-kwh" << endl;
} private:
Battery battery;
};
task3.cpp
#include <iostream>
#include "electricCar.hpp"
int main()
{
using namespace std;
// test class of Car
Car oldcar("DingDing", "maka", 2008);
cout << "--------oldcar's info--------" << endl;
oldcar.update_odometers(2500);
oldcar.info();
cout << endl;
// test class of ElectricCar
ElectricCar newcar("kapani", "soucat", 2015);
newcar.update_odometers(5000);
cout << "\n--------newcar's info--------\n";
newcar.info();
newcar.update_odometers(2500);
}
运行测试截图:


pets.hpp
#include<string> using namespace std; class MachinePets
{
public:
MachinePets(const string s) : nickname(s) { }
string get_nickname() const { return nickname; }
virtual string talk() { return "bing bo~"; }
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~"; }
};
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);
}
运行测试截图:

C++程序设计实验四 继承的更多相关文章
- 20172314 Android程序设计 实验四
课程:<程序设计与数据结构> 班级: 1723 姓名: 方艺雯 学号:20172314 实验教师:王志强 实验日期:2018年5月30日 必修/选修: 必修 1.实验内容及要求 (1)An ...
- .NET程序设计实验四
实验四 文件操作 一.实验目的 1. 掌握窗口控件的使用方法: 2. 掌握文件系统的操作方法.File 类和 Directory类的使用. 二.实验要求 根据要求,编写 C#程序,并将程序代码和运行 ...
- 2017-2018-1 20155214&20155216 实验四:外设驱动程序设计
2017-2018-1 20155214&20155216 实验四:外设驱动程序设计 实验四外设驱动程序设计-1 实验要求: 学习资源中全课中的"hqyj.嵌入式Linux应用程序开 ...
- 20155303 实验四 Android程序设计
20155303 实验四 Android程序设计 目录 第24章:初识Android 任务一: 完成Hello World, 要求修改res目录中的内容,Hello World后要显示自己的学号 学习 ...
- 20155239 实验四 Android程序设计
20155239 实验四 Android程序设计 目录 第24章:初识Android 任务一: 完成Hello World, 要求修改res目录中的内容,Hello World后要显示自己的学号 学习 ...
- 20184302 2019-2020-2 《Python程序设计》实验四报告
20184302 2019-2020-2 <Python程序设计>实验四报告 课程:<Python程序设计> 班级: 1843 姓名: 李新锐 学号:184302 实验教师:王 ...
- 20145316&20145229实验四:驱动程序设计
20145316&20145229实验四:驱动程序设计 结对伙伴:20145316 许心远 博客链接:http://www.cnblogs.com/xxy745214935/p/6130871 ...
- 20145213 《Java程序设计》实验四 Android开发基础
20145213 <Java程序设计>实验四 Android开发基础 说在前面的话 不同以往实验,对于这次实验具体内容我是比较茫然的.因为点我,打开实验四的链接居然能飘出一股熟悉的味道,这 ...
- 20145308刘昊阳 《Java程序设计》实验四 Android环境搭建 实验报告
20145308刘昊阳 <Java程序设计>实验四 Android环境搭建 实验报告 实验名称 Android环境搭建 实验内容 搭建Android环境 运行Android 修改代码,能输 ...
- 20145225《Java程序设计》 实验四 Android开发基础
20145225<Java程序设计> 实验四 Android开发基础 实验报告 实验内容 安装Android Studio 运行安卓AVD模拟器 使用安卓运行出虚拟手机并显示HelloWo ...
随机推荐
- IPv4和IPv6地址的存取
存入IP地址时,使用inet_pton函数将输入的十进制字符串转出二进制.取出IP时再使用inet_ptop函数将"二进制整数"转成"点分十进制整数"显示.这两 ...
- MySQL join语句怎么优化?
在MySQL的实现中,Nested-Loop Join有3种实现的算法: 1. Simple Nested-Loop Join:简单嵌套循环连接 2. Block Nested-Loop Join:缓 ...
- SpringBoot 项目中配置多个 Jackson 的 ObjectMapper ,以及配置遇到的坑
目录 问题说明 原因排查分析 结论总结 Jackson 自动装配分析 问题说明 我们都知道,SpringBoot 项目中,如果引入了 Jackson 的包,哪怕不配置,SpringBoot 也会帮我们 ...
- 最大公约数gcd和最小公倍数lcm
迭代版本 int gcd(int a, int b) { while (b != 0) { int r = a % b; a = b; b = r; } return a; } int lcm(int ...
- Redis--回顾提要
一.写在前 知识学了就忘!不用就忘!我太健忘!特此记录!用于复习打卡!Redis干就完事了! 二.来辣! Redis做异步队列:一般list结构做队列,rpush生产消息,lpop消费消息,当lpop ...
- 图文并茂学习记录--从零开始进行微信小程序开发+引入Vant Weapp组件
新建项目 创建页面 让人崩溃的东西来了 经过研究,发现这个图标不可以放在二级,只能一级 项目初始化 引入VANT组件库 文档地址:https://youzan.github.io/vant-weapp ...
- Google Cloud Spanner 究竟是什么?
谷歌于2017年推出的Google Cloud Spanner,原是谷歌内部使用的一个数据服务,后来又成为了谷歌云平台上搭建的数据库服务. Google Cloud Spanner 是一种数据库,它结 ...
- 【Django drf】视图类APIView之五层封装 ApiView的类属性 drf配置文件
目录 ApiView的类属性 drf 配置文件之查找顺序 drf之请求 APIView之请求相关配置 drf之响应 APIView之响应相关配置 Response对象属性 视图类 序列化类 路由 基于 ...
- java基础(六):面向对象
面向对象 面向对象:以类的方式组织代码,以对象组织数据 特性: 封装 继承 多态 类:抽象概念 对象:具体事物 面向对象是java学习的重中之重,毕竟java就是一个面向对象的语言~ 类 = 属性+方 ...
- ACID和CAP的比较
https://www.jdon.com/artichect/acid-cap.html 1 简介 事务机制ACID和CAP理论是数据管理和分布式系统中两个重要的概念,很不巧,这两个概念中都有相同的& ...