程序源码:

#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. Error: Could not get apiVersions from Kubernetes

    问题 部署pod时遇到问题 # helm install chart.tgz Error: Could not get apiVersions from Kubernetes: unable to r ...

  2. [编程基础] C++多线程入门6-事件处理的需求

    原始C++标准仅支持单线程编程.新的C++标准(称为C++11或C++0x)于2011年发布.在C++11中,引入了新的线程库.因此运行本文程序需要C++至少符合C++11标准. 文章目录 6 事件处 ...

  3. SQLSERVER 的主键索引真的是物理有序吗?

    一:背景 1. 讲故事 最近在看 SQL SERVER 2008 查询性能优化,书中说当一个表创建了聚集索引,那么表中的行会按照主键索引的顺序物理排列,这里有一个关键词叫:物理排列,如果不了解底层原理 ...

  4. Go+beego接入OSS上传

    路由 f, h, err := c.GetFile("uploadFile") if err != nil { logx.Error("getfile err " ...

  5. 【深入浅出Seata原理及实战】「入门基础专题」带你透析认识Seata分布式事务服务的原理和流程(1)

    分布式事务的背景 随着业务的不断发展,单体架构已经无法满足我们的需求,分布式微服务架构逐渐成为大型互联网平台的首选,但所有使用分布式微服务架构的应用都必须面临一个十分棘手的问题,那就是"分布 ...

  6. Docker容器使用 (入门到精通)

    Docker容器 CentOS安装Docker Docker 分为 CE 和 EE 两大版本.CE 即社区版(免费,支持周期 7 个月),EE 即企业版,强调安全,付费使用,支持周期 24 个月. D ...

  7. .NET 团队 更新了 .NET 语言策略

    2023年2月6日 ,.NET团队在官方博客上发布了.NET 语言策略的更新文章,具体参见 https://devblogs.microsoft.com/dotnet/update-to-the-do ...

  8. FAQ 关于pip你应该知道的一些技巧

    pip简介 pip是安装了python之后的一个应用程序,包管理程序,有点类似于yum.npm.apt等工具 物理位置一般是python.exe所在目录下的scripts下 以我为例,我Python安 ...

  9. python学习第三周总结

    文件操作 文件的读写模式 文件的操作模式 文件相关操作 文件内光标移动 文件内容修改 函数前戏 函数的语法结构 函数的定义和调用 函数的分类 函数的返回值 函数的参数 函数参数之位置参数 默认参数 可 ...

  10. spring-in-action_day01

    前景说明:SpringInAction主要致力于SpringBoot为基础的讲解,尽可能多的使用SpringBoot,可以减少显行的配置,如xml配置,可以更加的专注于功能的实现. 第一章:主要讲了如 ...