[C++] OOP - Base and Derived Classes
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:
- The Quote constructor initializes the base-class part of the Bulk_quote. E.g. the bookNO and price members
- execute the empty Quote constructor body
- Initilize the direct member min_qty and discount
- 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的更多相关文章
- 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? ...
- 【转载】#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 ...
- Virtual functions in derived classes
In C++, once a member function is declared as a virtual function in a base class, it becomes virtual ...
- [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 ...
- C++ Core Guidelines
C++ Core Guidelines September 9, 2015 Editors: Bjarne Stroustrup Herb Sutter This document is a very ...
- C++ Knowledge series 1
Programming language evolves always along with Compiler's evolvement. 1. The C++ Object Model: Strou ...
- <Effective C++>读书摘要--Inheritance and Object-Oriented Design<一>
1.Furthermore, I explain what the different features in C++ really mean — what you are really expres ...
- Swift 中的静态方法继承
Base and Derived Classes: class BaseClass{ class func staticMethod(){ println("BaseClass.static ...
- 【足迹C++primer】52、,转换和继承虚函数
转换和继承,虚函数 Understanding conversions between base and derived classes is essential to understanding h ...
随机推荐
- ARC下IBOutlet用weak还是strong
原文来自这里. 今天用Xcode5的时候,发现默认的IBoutlet的属性设置为weak——因为Xcode5建立的工程都是ARC的了.但是当时还有点不明白,因为项目的原因,一直没有正式使用过ARC.于 ...
- tomcat如何配置俩个版本
Java-web除了JDK,还需配置服务器(tomcat); 如何配置俩个版本的tomcat; 1.将tomcat-bin目录下的startup.bat和catalina.bat里的%CATALINA ...
- 【模板】RMQ(计算区间最值)
①一维RMQ (1) dp[i,j] 表示从第i个数起连续2j个数中的(最大值min.最小值max.最大公约数gcd……),通过更改下列代码中的红色函数即可实现. (2) b数组放置所需查询的数列. ...
- 复习宝典之Git分布式版本控制
查看更多宝典,请点击<金三银四,你的专属面试宝典> 第三章:Git分布式版本控制 1)git文件状态 git中的文件有以下几种状态: 未跟踪(untrack):表示文件为新增加的. 已修改 ...
- Django的MVT的思路
1.先上两张图片 2.我的理解 view在MVT框架里面,起到的是中间调度的作用. a.在diango里面有个关键性路径的配置 就是在django2.0前的url和在2.0后的path. 为避免一个项 ...
- 浅谈CSS高度坍塌
高度坍塌情况: 当父元素没有设置高度,且子元素块都向左(右)浮动起来,那么父元素就会出现坍塌的现象. 解决办法: 在父元素包含块中加一个div: 优点:兼容性强,适合初学者. 缺点:不利于优化. 方法 ...
- Linux的数据传输
1. sz 与 rz sz:将选定的文件从本地发送(send)到远端机器 rz:运行该命令会弹出一个文件选择窗口,从本地选择文件夹,接收(receive)从远端的文件 mac 下使用 brew 安装: ...
- Hadoop-Hive学习笔记(2)
1.Hive基本操作 #创建数据库hive>create database name;#创建新表hive> create table students(id int,name string ...
- Python学习笔记:第3天 字符串的操作
目录 1. python的数据类型 2. int类型的操作 3. bool类型 4. 字符串的操作 5. for循环 1. python的数据类型 int 整数 str 字符串.一般不会用字符串保存大 ...
- C#/STM32 WAV转byte WAV数据格式
最近在做STM32音乐播放器,选取了最容易做的WAV格式. 为了更方便开发自己做了一个WAV转Byte的小上位机 附软件下载链接 链接:https://pan.baidu.com/s/1Zz7bczZ ...