cc26a_demo-CppPrimer_动态绑定_多态-代码示范
//多态性
//从派生类到基类的转换
//引用或者指针既可以指向基类对象,也可以指向派生类对象
//只有通过引用或者指针调用虚函数才会发生动态绑定。
//为什么定义虚的函数?可以重新定义。只有虚函数才可以重写,(基类或者派生类里面)
////动态绑定的方法,执行出来的效果,就是多态
#include <iostream>//txwtech-202001
#include <string>//多态,动态绑定 using namespace std;//导入名称空间 class Animal
{
//成员略
}; class Dog :public Animal
{
//成员略
};
class Cat :public Animal
{ };
class Item_base
{
public:
//int x;
Item_base(const std::string &book = "",
double sales_price = 0.0) :isbn(book), price(sales_price) {}//构造函数
std::string book() const
{
return isbn;
}
virtual double net_price(size_t n) const//为什么定义虚的函数?可以重新定义。只有虚函数才可以重写
{
return n * price;
} private://类的内部使用
std::string isbn;
protected://专门用来做继承用的
double price; };
class Bulk_item :public Item_base
{
public:
Bulk_item(const std::string &book = "", double sales_price = 0.0,
size_t qty = , double disc_rate = 0.0) :
Item_base(book, sales_price), min_qty(qty), discount(disc_rate) {}
void test()
{
//cout << x << endl;
cout << price << endl;
//cout << isbn << endl;
}
void test2(const Bulk_item &d, const Item_base &b)
{
//cout << d.x << endl;
cout << d.price << endl;
//cout << b.x << endl;
//cout << b.price << endl;
}
double net_price(size_t cnt) const//继承函数时,这里可以重定义,继承函数
{
if (cnt >= min_qty)
return cnt * ( - discount)*price;
else
return cnt * price; } private:
size_t min_qty;
double discount; };
//做一个函数
void print_total(ostream &os, Item_base *item, size_t n)
{
os << "ISBN: " << item->book() << "\t number sold: " << n << "\ttotal price: " << item->net_price(n) << endl;
//item->net_price(n)代码就是多态的
}
int main()
{
//Animal a;
//Dog d;
//Cat c;
//Item_base item("0-12-3456-789", 9.9);
//cout << item.book() << ": " << item.net_price(10) << endl;
////cout << item.x << endl;
///*cout << item.isbn << endl;
//cout << item.price << endl;*/
////cout << "hello111" << endl;
//Bulk_item item2("0-12-3456-789", 9.9, 10, 0.12);
////cout << item2.x << endl;
//cout << item2.book() << ": " << item2.net_price(10) << endl;
//item2.test();
//item2.test2(item2, item); //多态,动态绑定的实现 Item_base* a = new Item_base("1-234-567-01",11.0);
Bulk_item* b = new Bulk_item("1-234-567-02",22.0,,0.05);//指向子类对象的指针 print_total(cout,a,);
print_total(cout,b,); Item_base* books[];//指针数组,5个指针
books[] = new Item_base("0-123-456-01",10.0);//new 创建基类对象
books[] = new Bulk_item("0-123-456-01", 20.0,,0.05);//new 也可以指向派生类对象
books[] = new Item_base("0-123-456-03", 30.0);//new 创建基类对象
books[] = new Bulk_item("0-123-456-04", 40.0, , 0.15);//new 也可以指向派生类对象
books[] = new Bulk_item("0-123-456-05", 50.0, , 0.18);//new 也可以指向派生类对象 int num[];
num[] = ;
num[] = ;
num[] = ;
num[] = ;
num[] = ; for (int i = ; i < ; i++)
{
print_total(cout,books[i],num[i]);
//动态绑定的方法,执行出来的效果,就是多态
//根据指针所指向的对象不同,指向不同的对象,对象去调用不同的虚函数。有可能是基类,有可能是
//派生类的。
}
//分别调用基类的netprice与派生类的Netprice. netprice就是多态,根据对象决定(基类不打折,派生类打折)
//比如飞机在飞,鸟儿也在非,不同的飞 getchar();
return ; //多态性
//从派生类到基类的转换
//引用或者指针既可以指向基类对象,也可以指向派生类对象
//只有通过引用或者指针调用虚函数才会发生动态绑定。
//为什么定义虚的函数?可以重新定义。只有虚函数才可以重写,(基类或者派生类里面)
}
cc26a_demo-CppPrimer_动态绑定_多态-代码示范的更多相关文章
- 自学Python5.6-面向对象三大基本特征_多态
自学Python之路-Python基础+模块+面向对象自学Python之路-Python网络编程自学Python之路-Python并发编程+数据库+前端自学Python之路-django 自学Pyth ...
- 《Java编程思想》学习笔记_多态
多态 多态指一个行为产生多种状态,针对父类类型可接收其子类类型,最终执行的状态由具体子类确定,其不同子类可呈现出不同状态.例如人[父类]都会跑步[行为],但小孩[子类]跑步.成年人[子类]跑步.运动员 ...
- 关于AJAX 的交互模型、交互流程及代码示范
AJAX = 异步JavaScript + XML. 它是一种用于创建快速动态网页的技术.通过在后台与服务器进行少量数据交换,AJAX 可以使网页实现异步更新.这意味着可以在不重新加载整个网页的情况 ...
- Java 动态绑定和多态
动态绑定和多态 动态绑定是指:"在执行程序期间(而非编译期间),判断引用所指对象的实际类型,调用其相应的方法." 动态绑定(多态)存在的条件 要有继承. 要有重写. 父类引用指向子 ...
- c++ UDP套接字服务器端代码示范
c++ UDP套接字服务器端代码示范 #include<winsock2.h> //包含头文件 #include<stdio.h> #include<windows.h& ...
- cc28c_demo.cpp,派生类的构造函数和析构函数-代码示范3
cc28c_demo.cpp,派生类的构造函数和析构函数-代码示范3 //派生类的构造函数和析构函数//派生类的构造函数(执行步骤)//--执行基类的构造函数//--执行成员对象的构造函数//--执行 ...
- c++ cc24a_demo //转换函数,用来做转换操作符,int()括号里面必须是空的,必须定义为const,代码示范
c++ cc24a_demo //转换函数,用来做转换操作符,int()括号里面必须是空的,必须定义为const,代码示范 #include <iostream> #include < ...
- cc22a_demo_c++重载自增自减操作符-代码示范
cc22a_demo_c++重载自增自减操作符-代码示范 #define _CRT_SECURE_NO_WARNINGS #include <iostream> using namespa ...
- MFC基于CAsyncSocket套接字客户端代码示范
MFC基于CAsyncSocket套接字客户端代码示范 https://blog.csdn.net/txwtech/article/details/93016190
随机推荐
- 使用webstorm 搭建 vue 开发环境
一.首先安装 node.js 安装成功后在cmd里面使用:node -v 命令查看安装是否成功 下载链接: 链接:https://pan.baidu.com/s/1CL9J4Ryp3sL0zPYKJy ...
- discuz mlv3.x命令注入
本次漏洞是由于Discuz! ML对于cookie字段的不恰当处理造成的cookie字段中的language参数未经过滤,直接被拼接希尔缓存文件中,而缓存文件随后被加载,造成代码执行. 共有60出利用 ...
- IDEA 插件推荐 —— 让你写出好代码的神器!
概述 今天介绍的插件主要是围绕编码规范的.有追求的程序员,往往都有代码洁癖,要尽量减少代码的「坏味道」. 代码静态检查是有很多种类,例如圈复杂度.重复率等.业界提供了很多静态检查的插件来识别这些不合规 ...
- 二、【Python】机器学习-监督学习
关键词 分类(Classification) 回归(Regression) 泛化(Generalize) 过拟合(Overfitting) 欠拟合(Underfitting) 2.1 分类与回归 监督 ...
- 深入了解ConcurrentHashMap
在上一篇文章[简单了解系列]从基础的使用来深挖HashMap里,我从最基础的使用中介绍了HashMap,大致是JDK1.7和1.8中底层实现的变化,和介绍了为什么在多线程下可能会造成死循环,扩容机智是 ...
- JAVASE(十八) 反射: Class的获取、ClassLoader、反射的应用、动态代理
个人博客网:https://wushaopei.github.io/ (你想要这里多有) 1.反射(JAVA Reflection)的理解 1.1 什么是反射(JAVA Reflection) ...
- Java实现 蓝桥杯 基础练习 杨辉三角形
基础练习 杨辉三角形 时间限制:1.0s 内存限制:256.0MB 提交此题 锦囊1 锦囊2 问题描述 杨辉三角形又称Pascal三角形,它的第i+1行是(a+b)i的展开式的系数. 它的一个重要性质 ...
- Java实现 蓝桥杯VIP 算法训练 装箱问题
题目描述 有一个箱子容量为V(正整数0≤V≤20000),同时有n个物品(0<n≤30,每个物品有一个体积(正整数). 要求nn个物品中,任取若干个装入箱内,使箱子的剩余空间为最小. 输入输出格 ...
- Java实现 蓝桥杯VIP 算法提高 聪明的美食家
算法提高 聪明的美食家 时间限制:1.0s 内存限制:256.0MB 问题描述 如果有人认为吃东西只需要嘴巴,那就错了. 都知道舌头有这么一个特性,"由简入奢易,由奢如简难"(据好 ...
- java代码(8) ---guava字符串工具
guava字符串工具 一.Joiner 根据指定的分隔符把字符串连接在一起,MapJoiner执行相同的操作,但是针对Map的key和value 分析源码可知:该类构造方法被private修饰,无法直 ...