C++中的继承(inheritance) 和动态绑定(dynamic binding) 简介

继承(inheritance)和动态绑定(dynamic binding) 是面向对象的重要组成部分, 即继承(inheritance)和多态(polymorphism),

可以使 派生类(derived class)拥有 基类(base class) 的接口(interface);

派生类可以覆写(override)基类的虚函数(virtual function), 符合特定的功能;

派生类可以隐式地转换为基类 (derived-to-base conversion), 但不可逆, 因为派生类的对象包含自己的部分 和 基类的对象的部分;

尽量使用基类的构造器, 去构造基类的对象, 可以易于管理; 对于静态成员,只定义(define)一次, 忽略其他定义;

可以显示定义类无法被继承, 在类后添加 "final" 限定词;

代码:

/*
 * CppPrimer.cpp
 *
 *  Created on: 2013.11.12
 *      Author: Caroline
 */

/*eclipse cdt*/

#include <iostream>
#include <string>
#include <cstddef>  

using namespace std;  

class Quote {
public:
    Quote() = default;
    Quote (const std::string& book, double sales_price) :
        bookNo (book), price (sales_price) {}
    std::string isbn() const { return bookNo; }
    virtual double net_price (std::size_t n) const { return n* price; } //虚函数
    virtual ~Quote() = default; //动态绑定析构器
private:
    std::string bookNo;
protected: //受保护类型
    double price = 0.0;
};  

class Bulk_quote final : public Quote { //final限定词, 无法被继承
public:
    Bulk_quote() = default;
    Bulk_quote(const std::string&book, double p, std::size_t qty, double disc) :
        Quote(book, p), min_qty(qty), discount(disc) {} //使用基类的构造器
    double net_price(std::size_t cnt) const override;
private:
    std::size_t min_qty = 0; //折扣的最小量
    double discount = 0.0; //折扣
};
double Bulk_quote::net_price(std::size_t cnt) const
{
    if (cnt >= min_qty)
        return cnt * (1-discount) * price;
    else
        return cnt * price;
}
int main (void) {  

    Quote q("CppPrimer", 99);
    Bulk_quote bq("CppPrimer", 99, 10, 0.5);
    std::size_t n = 20;
    std::cout << "We want to buy " << n << " books. " << std::endl;
    std::cout << "Quote net_price : " << q.net_price(n) << std::endl;
    std::cout << "Bulk_quote net_price : " << bq.net_price(n) << std::endl;  

    return 0;  

}

作者:csdn博客 Spike_King

更多精彩内容:http://www.bianceng.cnhttp://www.bianceng.cn/Programming/cplus/

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索const
, double
, 构造器
, std
, 绑定C++类
Inheritance
dynamic binding、继承者们简介、继承者们剧情简介、太原杨继承简介、继承者们每集简介,以便于您获取更多的相关知识。

时间: 2024-11-10 00:47:31

C++中的继承(inheritance) 和动态绑定(dynamic binding) 简介的相关文章

C++中多层继承(inheritance) 的使用及示例

动态绑定只能应用在虚函数(virtual function), 通过指针(->)或引用(.)调用; 声明基类指针, 绑定派生类对象; 可以使用"shared_ptr<Abstract_Base_Class> p(new Derived_Class(para));"的形式, 动态绑定派生的类; 可以为动态基类添加一个接口(interface), 使用友元函数, 访问基类的私有成员变量; 并把具体操作写入接口中; 如果一个派生类, 没有实现抽象基类的纯虚函数, 则会继承此

【《Objective-C基础教程 》笔记ch04】(五)OC中的继承inheritance机制

一.为什么需要继承                            使用继承一方面继承了父类的特性,另一方便解决了重复代码维护问题. 二.继承之语法          1. @interface 子类名:父类名          2. OC只支持单继承,不支持继承多个父类.          3. 重构--移植和优化代码. 三. 继承的工作机制           1. 方法调度               子类拥有一个指向它父类的引用指针,消息传递时,OC的方法调度机制使用该信息来找到正

C++中如何在容器中使用继承和虚函数

容器不支持混合类型, 如果直接把派生类对象, 存入基类容器中, 则无法使用派生-基转换(derived-base conversion); 因为转换只能发生在指针和引用 过程中, 不能发生在 对象直接赋值, 如果是直接转换, 则会产生截断(sliced down); 即派生类部分被切除, 只留下基类部分; 所以存入容器中的派生类 输出为基类部分 的虚函数; 如果想在容器中, 进行继承, 则需要使用指针, 包括智能指针(如:shared_ptr<>), 则会输出派生类的覆写(override)版

从一个组件的实现来深刻理解JS中的继承

其实,无论是写什么语言的程序员,最终的目的,都是把产品或代码封装到一起,提供接口,让使用者很舒适的实现功能.所以对于我来说,往往头疼的不是写代码,而是写注释和文档!如果接口很乱,肯定会头疼一整天. JavaScript 最初是以 Web 脚本语言面向大众的,尽管现在出了服务器端的 nodejs,但是单线程的性质还没有变.对于一个 Web 开发人员来说,能写一手漂亮的组件极为重要.GitHub 上那些开源且 stars 过百的 Web 项目或组件,可读性肯定非常好. 从一个例子来学习写组件 组件教

Style在Android中的继承关系

Android的Styles(样式)和Themes(主题)非常类似Web开发里的CSS,方便开发者将页面内容和布局呈现分开.Style和Theme在Android里的定义方式是完全一样的,两者只是概念上的区别:Style作用在单个视图或控件上,而Theme用于Activity或整个应用程序.由于作用范围的不同,Theme也就需要比Style包含更多的定义属性值的项目(item).不过本文,我将Style和Theme都归为Style来称呼. Android的Style和Web的CSS相比,有一个缺

YUI 3中的继承模式及其用法简介

YUI 3中的继承模式及其用法简介 January 6, 2010 at 6:30 am by Stoyan Stefanov 文中讨论了YUI 3 两种代码复用的方式:基于类的继承(classical inheritance pattern)和原型继承(prototypal inheritance)模式. 依赖 在种子文件yui-min.js中就有属于core YUI 3 API 部分的原型模式(prototypal pattern)继承.如果需要类模式(classical pattern)的

在JavaScript中实现继承

javascript|继承 JavaScript脚本语言是一种功能强大的面向对象的语言.本文描述了如何在JavaScript中实现继承. Prototype JavaScript没有实现类继承,但可以通过prototype实现.每个JavaScript类中都包含一个prototype对象,当访问一个对象的属性和方法时,它首先从当前对象查找,如果该属性在JavaScript类定义,则直接访问:否则,从类的prototype对象中查找,如果找到则直接访问,否则从prototype的prototype

ORM中的继承关系映射全解——单表继承体系、一实体一具体表、一实体一扩展表

ORM中的继承关系映射全解--单表继承体系.一实体一具体表.一实体一扩展表.接口映射 本文涉及的内容包括: 1.单表继承体系 2.一实体一具体表 3.一实体一扩展表 4.接口实现映射vs基类继承映射 1.单表继承体系 所谓单表继承体系就是用一张数据库表存储整个继承体系中的所有实体的数据.单表继承体系适合那种继承体系中实体数目相对较少,总记录数相对较少,子类对父类的属性扩展也相对较少的情形. 单表继承体系优点是读/写继承体系中的每个实体的数据,都只需操作一张表,性能较好,并且,新增继承类,或扩展实

JavaScript中的继承方式详解

 这篇文章主要介绍了JavaScript中的继承方式详解,本文讲解了js继承的概念.原型式继承与类式继承.原型链继承.类式继承.组合继承.原型式继承等内容,需要的朋友可以参考下     js继承的概念 js里常用的如下两种继承方式: 原型链继承(对象间的继承) 类式继承(构造函数间的继承) 由于js不像java那样是真正面向对象的语言,js是基于对象的,它没有类的概念.所以,要想实现继承,可以用js的原型prototype机制或者用apply和call方法去实现 在面向对象的语言中,我们使用类来