There is a base class at the root of the hierarchy, from which the other class inherit, directly or indirectly.

These inheriting classes are known as derived calsses.

The key ideas in Object-Oriented Programming are data abstraction, inheritance and dynamic binding.

Using data abstraction, we only expose the interface and hide the detail implementation.

Through inheritance, we define classes that model relationships among similar types.

Through dynamic binding, we can use the objects of these types and ignore the detail how they differ.

Dynamic binding

In C++, dynamic binding happens when a virtual function is called through a reference(or pointer) to a base class.

class Quote{
public:
virtual double net_price(size_t n) const;
} class Bulk_quote : public Quote{
public:
double net_price(size_t n) const;
} void print_total(ostream & os, const Quote & item, size_t n){
os << item.net_price(n);
} print_total(cout, base, ); // base has Quote type, call Ouote version
print_total(cout, bulk, ); // bulk has Bulk_quote, call bulk_quote version

The decision as to which version to run depends on the type of argument at run time. Therefore, dynamic binding is known as runtime binding.

Basic class ordinarily should define a virtual destructor. Virtual destructor are needed even if they do not work.

Any non-static member function, other than constructor, maybe virtual. The virtual keyword only appear on the declaration inside the class, and may not appear on the definition that apper outside the class body.

A function that is virtual in base class is implicitly virtual in the derived classess as well.

Member functions that are not declared as virtual are resolved at compile time, not run time.

If a derived class do not override the virtual from its base, then like any other member, the derived class inherit the version defined in the base class.

A derived class contains subobject corresponding to its base class. We can an object of a derived class as if it was an object of its base class. We can bind an reference(or pointer) to the base-class part of a derived class.

    Quotes item;        // an object of base type
Bulk_quote bulk;   // an object of derived type
Quotes *p = &item; // p points to a Quote object
p = &bulk;      // p points the Quote part of bulck
Quote & ref = bulk; // ref bound to the Quote part of bulck

The fact that the derived object contains subobjects for its base classes is the key to how inheritance work.

Like any ohter code that create an objec to the base-class type, a derived class must use a base-class constructor to initialize its base-class part.

Bulk_quote(const string& bookNo, double price, size_t qty, double disc): Quote(bookNo, price), min_qty(qty), discount(dis) {}

Process flow:

  1. The Quote constructor initializes the base-class part of the Bulk_quote. E.g. the bookNO and price members
  2. execute the empty Quote constructor body
  3. Initilize the direct member min_qty and discount
  4. execute the empty function body of Bulk_quote constructor

The keyword final prevent a class from being used as a base class

    class NoDerived final { /*  */};
class DerivedType : NoDerived { /* */}; // error NoDerived is final

The static type is the type of a variable or other expression. The static type of an express is always known at compile time - it is the type with which a variable is declared or an expression yields.

The dynamic type is the type of an object. The dynamic type is the type of object in momery that the variable or expression represents. The dynamic type may not know until run time.

There is a implicit(automatic) conversion from base to derived. A base object may not contain members defined by the derived class.

    Quote base;
Bulk_quote * bulk = &base; // error: cannot convert base to derived
Bulk_quote & bulkRef = base; // error: cannot convert base to derived

If we know the conversion is safe, we can use static_cast to make the conversion.

When we initialize an object of base type from an object of derived type, only the base part of the derived object is copied, moved or assigned. The derived part of the derived object is ignored.

Reference:

C++ Primer, Fifth Edition, chapter 15 Object-Oriented Programming

[C++] OOP - Base and Derived Classes的更多相关文章

  1. How can I protect derived classes from breaking when I change the internal parts of the base class?

    How can I protect derived classes from breaking when I change the internal parts of the base class? ...

  2. 【转载】#330 - Derived Classes Do Not Inherit Constructors

    A derived class inherits all of the members of a base class except for its constructors. You must de ...

  3. Virtual functions in derived classes

    In C++, once a member function is declared as a virtual function in a base class, it becomes virtual ...

  4. [C++] OOP - Virtual Functions and Abstract Base Classes

    Ordinarily, if we do not use a function, we do not need to supply a definition of the function. Howe ...

  5. C++ Core Guidelines

    C++ Core Guidelines September 9, 2015 Editors: Bjarne Stroustrup Herb Sutter This document is a very ...

  6. C++ Knowledge series 1

    Programming language evolves always along with Compiler's evolvement. 1. The C++ Object Model: Strou ...

  7. <Effective C++>读书摘要--Inheritance and Object-Oriented Design<一>

    1.Furthermore, I explain what the different features in C++ really mean — what you are really expres ...

  8. Swift 中的静态方法继承

    Base and Derived Classes: class BaseClass{ class func staticMethod(){ println("BaseClass.static ...

  9. 【足迹C++primer】52、,转换和继承虚函数

    转换和继承,虚函数 Understanding conversions between base and derived classes is essential to understanding h ...

随机推荐

  1. RCF的简单使用教程以及什么是回调函数

    RCF的使用教程 RCF(Remote Call Framework)是一个使用C++编写的RPC框架,在底层RCF支持多种传输实现方式(transport implementations). 包括T ...

  2. 嗨翻C语言笔记(一)

    对自己狠一点,逼自己努力,总有一天你会感谢今天的自己! C语言不支持现成的字符串, 只能用数组表示. & (and)运算, 即两个数的每个二进制位都进行比较, 对等位均为1时为1, 否则为0. ...

  3. MYSQL 8.0.11 安装过程及 Navicat 链接时遇到的问题

    参考博客:https://blog.csdn.net/WinstonLau/article/details/78666423 我的系统和软件版本是这样的: 系统环境:win7.64位 MySQL版本: ...

  4. 利用ascii码生成26个英文字母

    <script> let a = ""; for (var i = 65; i < 91; i++) { a += String.fromCharCode(i); ...

  5. PHP 获取客户端 IP 地址

    先来了解一个变量的含义: $_SERVER['REMOTE_ADDR']:浏览当前页面的用户计算机的ip地址 $_SERVER['HTTP_CLIENT_IP']:客户端的ip $_SERVER['H ...

  6. 大数据学习--day06(Eclipse、数组)

    Eclipse.数组 Eclipse 的基本设置   调节控制条字体大小. Window -> Preferences -> General -> Appearance -> ...

  7. python三大器之while,if,for循环

    一.for循环(遍历循环) 在Python你可能要经常遍历列表的所有元素,对每个元素执行相同的操作;对于包含数字的列表,可能要对每个元素进行相同的计算;在网站中,可能需要显示文章中的每个标题等等.某一 ...

  8. DMVPN的实验模拟与分析

    此篇博客正在介绍的是下图中的DMVPN: 为什么会出现DMVPN这个技术呢? 在这篇博客中https://www.cnblogs.com/huwentao/p/9355240.html介绍过Dynam ...

  9. vue.js使用axios

    使用axios的两种调用方式 1.安装axios $ cnpm install axios 2.在vue入口文件main.js中引入(推荐全局引入),或是在当前页面中引入(局部) import axi ...

  10. vuetify.js框架 下拉框数据改变DOM原数据未清除

    今天遇到一个奇怪的bug 需求很简单,就是将“引擎能力”下拉框选中的值作为筛选条件传入到“样本类型”下拉框中,默认“样本类型”下拉框显示所有样本类型 看图: 如图所示,功能很简单. 其实还是对vuet ...