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 ...
随机推荐
- C# 正则表达式常用的符号和模式解析
〇.正则表达式的基本语法符号 若只简单匹配固定字符串,则无需任何修饰符,例如:需要匹配字符串 77,则可直接写:new Regex("77"). 下边例举一下常用的符号:(知道下面 ...
- [图像处理] YUV图像处理入门5
12 yuv420转换为rgb(opencv mat) yuv格式具有亮度信息和色彩信息分离的特点,但大多数图像处理操作都是基于RGB格式,而且自己造轮子工作量太大.因此通常都会将yuv转换为rgb, ...
- vulnhub靶场之FUNBOX: UNDER CONSTRUCTION!
准备: 攻击机:虚拟机kali.本机win10. 靶机:Funbox: Under Construction!,下载地址:https://download.vulnhub.com/funbox/Fun ...
- 初始rust
安装rust 访问rust 按照步骤操作即可,安装很慢,请耐心等待 安装成功之后,请注意在命令行测试 rustc --version,cargo --version看看输出版本信息是否正常,如果不正常 ...
- 记一下Go类型转换问题
数值类型间可以相互转换 int<->int64,uint8<->float32,uint64<->float64 字符类型转换也可以 string<-> ...
- MRS_下载相关问题汇总
解决问题如下: MRS下载编译时,更改生成文件是HEX文件还是BIN文件 关于MounRiver下载时如何选择配置部分擦除 关于MounRiver下载起始地址配置问题 MRS下载编译时,更改生成文件是 ...
- 腾讯出品小程序自动化测试框架【Minium】系列(五)API详解(中)
写在前面 又有好久没更新小程序自动化测试框架Minium系列文章了,主要真的太忙,尽量做到每周一更吧,还请大家能够理解! 上篇文章为大家分享关于Minium中Minium.App模块的API 使用,接 ...
- linux环境编程(3): 使用POSIX IPC完成进程间通信
1. 写在前面 之前的文章总结了使用管道进行进程间通信的方法,除了pipe和fifo,Linux内核还为我们提供了其他更高级的IPC方式,包括共享内存,消息队列,信号量等,本篇文章会通过一个具有完整逻 ...
- 9月23日内容总结——pycharm的安装与使用、python语法规范与注释、变量和常量、索引取值以及部分数据类型简介
今日内容总结 目录 今日内容总结 一.pycharm的安装 1.软件介绍 2.正版安装 1.下载软件 2.安装软件 3.其他方法安装(需要先下载相关资源) ①无限试用法 ②傻瓜式激活法 ③淘宝购买 二 ...
- 如何注册chatgpt,如何使用chatgpt,以及chatgpt无法访问的原因。chatgpt问题总结。
chatgpt显示所在的国家地区不可用的原因. 1:chatgpt国内是不能访问的,是需要借助魔法. 一.注册过程中的问题. \1. OpenAI或ChatGPT官网打不开.这是由于ChatGPT目前 ...