程序源码:

#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++程序设计实验四 继承的更多相关文章

  1. 20172314 Android程序设计 实验四

    课程:<程序设计与数据结构> 班级: 1723 姓名: 方艺雯 学号:20172314 实验教师:王志强 实验日期:2018年5月30日 必修/选修: 必修 1.实验内容及要求 (1)An ...

  2. .NET程序设计实验四

    实验四  文件操作 一.实验目的 1. 掌握窗口控件的使用方法: 2. 掌握文件系统的操作方法.File 类和 Directory类的使用. 二.实验要求 根据要求,编写 C#程序,并将程序代码和运行 ...

  3. 2017-2018-1 20155214&20155216 实验四:外设驱动程序设计

    2017-2018-1 20155214&20155216 实验四:外设驱动程序设计 实验四外设驱动程序设计-1 实验要求: 学习资源中全课中的"hqyj.嵌入式Linux应用程序开 ...

  4. 20155303 实验四 Android程序设计

    20155303 实验四 Android程序设计 目录 第24章:初识Android 任务一: 完成Hello World, 要求修改res目录中的内容,Hello World后要显示自己的学号 学习 ...

  5. 20155239 实验四 Android程序设计

    20155239 实验四 Android程序设计 目录 第24章:初识Android 任务一: 完成Hello World, 要求修改res目录中的内容,Hello World后要显示自己的学号 学习 ...

  6. 20184302 2019-2020-2 《Python程序设计》实验四报告

    20184302 2019-2020-2 <Python程序设计>实验四报告 课程:<Python程序设计> 班级: 1843 姓名: 李新锐 学号:184302 实验教师:王 ...

  7. 20145316&20145229实验四:驱动程序设计

    20145316&20145229实验四:驱动程序设计 结对伙伴:20145316 许心远 博客链接:http://www.cnblogs.com/xxy745214935/p/6130871 ...

  8. 20145213 《Java程序设计》实验四 Android开发基础

    20145213 <Java程序设计>实验四 Android开发基础 说在前面的话 不同以往实验,对于这次实验具体内容我是比较茫然的.因为点我,打开实验四的链接居然能飘出一股熟悉的味道,这 ...

  9. 20145308刘昊阳 《Java程序设计》实验四 Android环境搭建 实验报告

    20145308刘昊阳 <Java程序设计>实验四 Android环境搭建 实验报告 实验名称 Android环境搭建 实验内容 搭建Android环境 运行Android 修改代码,能输 ...

  10. 20145225《Java程序设计》 实验四 Android开发基础

    20145225<Java程序设计> 实验四 Android开发基础 实验报告 实验内容 安装Android Studio 运行安卓AVD模拟器 使用安卓运行出虚拟手机并显示HelloWo ...

随机推荐

  1. IPv4和IPv6地址的存取

    存入IP地址时,使用inet_pton函数将输入的十进制字符串转出二进制.取出IP时再使用inet_ptop函数将"二进制整数"转成"点分十进制整数"显示.这两 ...

  2. MySQL join语句怎么优化?

    在MySQL的实现中,Nested-Loop Join有3种实现的算法: 1. Simple Nested-Loop Join:简单嵌套循环连接 2. Block Nested-Loop Join:缓 ...

  3. SpringBoot 项目中配置多个 Jackson 的 ObjectMapper ,以及配置遇到的坑

    目录 问题说明 原因排查分析 结论总结 Jackson 自动装配分析 问题说明 我们都知道,SpringBoot 项目中,如果引入了 Jackson 的包,哪怕不配置,SpringBoot 也会帮我们 ...

  4. 最大公约数gcd和最小公倍数lcm

    迭代版本 int gcd(int a, int b) { while (b != 0) { int r = a % b; a = b; b = r; } return a; } int lcm(int ...

  5. Redis--回顾提要

    一.写在前 知识学了就忘!不用就忘!我太健忘!特此记录!用于复习打卡!Redis干就完事了! 二.来辣! Redis做异步队列:一般list结构做队列,rpush生产消息,lpop消费消息,当lpop ...

  6. 图文并茂学习记录--从零开始进行微信小程序开发+引入Vant Weapp组件

    新建项目 创建页面 让人崩溃的东西来了 经过研究,发现这个图标不可以放在二级,只能一级 项目初始化 引入VANT组件库 文档地址:https://youzan.github.io/vant-weapp ...

  7. Google Cloud Spanner 究竟是什么?

    谷歌于2017年推出的Google Cloud Spanner,原是谷歌内部使用的一个数据服务,后来又成为了谷歌云平台上搭建的数据库服务. Google Cloud Spanner 是一种数据库,它结 ...

  8. 【Django drf】视图类APIView之五层封装 ApiView的类属性 drf配置文件

    目录 ApiView的类属性 drf 配置文件之查找顺序 drf之请求 APIView之请求相关配置 drf之响应 APIView之响应相关配置 Response对象属性 视图类 序列化类 路由 基于 ...

  9. java基础(六):面向对象

    面向对象 面向对象:以类的方式组织代码,以对象组织数据 特性: 封装 继承 多态 类:抽象概念 对象:具体事物 面向对象是java学习的重中之重,毕竟java就是一个面向对象的语言~ 类 = 属性+方 ...

  10. ACID和CAP的比较

    https://www.jdon.com/artichect/acid-cap.html 1 简介 事务机制ACID和CAP理论是数据管理和分布式系统中两个重要的概念,很不巧,这两个概念中都有相同的& ...