[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.
However, we must define every virtual function, regardless of whether it is used, bacuase compiler has no way to determine whether a virtual function is used.
Quote base("0-201-1", );
print_total(cout, base, ); // call Quote::net_print
Bulk_quote derived("0-201-2", , , 0.19);
print_total(cout, derived, ); // call Bulk_quote::net_print
base = derived; // copy the Quote part of derived into base
base.net_print(); // call Quote::net_print
When we call a virtual function on an expression that has a plain type - nonreference and nonpointer -- type, that call is bound at compile time. Both base and derived are plain - nonreference and nonpointer - type
Virtual are resolved at run time only if the call is called through a reference or pointer.
When a derived class override a virtual function, it may, but is not requied to, repeat the virtual keyword. Once a function is declared as virtual, remaining virtual in all the derived classes implicitly.
Virtual functions that have default arguments should use the same value in the base and derived classes.
In some cases, we want to force to call a particular version of the virtual.
double discounted = baseP->Quote::net_price();
Call the Quote version net_price regardless of the type of object to which baseP actually points. This call can be resolved at compile time.
We can specify a virtual function as a pure virtual function by writing =0 in the place of the function body. The =0 appear only on the declaration of the virtual function in the class body.
A class containing( or inherit without overriding) a pure virtual function is known as an abstract class. We cannot (directly) create a object of a type that is an abstract class.
A abstract class declares the interface of subsequent class to override.
class Disc_quote : public Quote{
public:
Disc_quote() = default;
Disc_quote(const string & bookNo, double price, size_t qty, double disc) : Quote(bookNo, price), quantity(qty, discount(disc) { }
double net_price(size_t) const = ; // an pure virtual function
protected:
size_t quantity = ;
double discount = 0.0;
}
Disc_quote discount; // error: define an Disc_quote object
Now we can reimplement Bulk_quote to inherit from Disc_quote rather than inherit directly from Quote:
class Bulk_quote: public Disc_quote{
public:
Bulk_quote() = default;
Bulk_quote(const string& bookNo, double price, size_t qty, double dis): Disc_quote(bookNo, price, qty, dis){ }
double net_price(size_t) const override;
};
Reference:
C++ Primer, Fifth Edition, chapter 15 Object-Oriented Programming
[C++] OOP - Virtual Functions and Abstract Base Classes的更多相关文章
- python 用abc模块构建抽象基类Abstract Base Classes
见代码: #!/usr/bin/env python # -*- coding: utf-8 -*- # @Time : 2018/08/01 16:58 from abc import ABCMet ...
- virtual base classes
virtual base classes用来实现菱形继承解决多个重复subobject的问题 //: C09:VirtualBase.cpp // Shows a shared subobject v ...
- 纯虚函数(pure virtual function )和抽象类(abstract base class)
函数体=0的虚函数称为“纯虚函数”.包含纯虚函数的类称为“抽象类” #include <string> class Animal // This Animal is an abstract ...
- Virtual functions in derived classes
In C++, once a member function is declared as a virtual function in a base class, it becomes virtual ...
- Standard C++ Programming: Virtual Functions and Inlining
原文链接:http://www.drdobbs.com/cpp/standard-c-programming-virtual-functions/184403747 By Josée Lajoie a ...
- [CareerCup] 13.3 Virtual Functions 虚函数
13.3 How do virtual functions work in C++? 这道题问我们虚函数在C++中的工作原理.虚函数的工作机制主要依赖于虚表格vtable,即Virtual Table ...
- [译]GotW #5:Overriding Virtual Functions
虚函数是一个很基本的特性,但是它们偶尔会隐藏在很微妙的地方,然后等着你.如果你能回答下面的问题,那么你已经完全了解了它,你不太能浪费太多时间去调试类似下面的问题. Problem JG Ques ...
- virtual方法和abstract方法
在C#的学习中,容易混淆virtual方法和abstract方法的使用,现在来讨论一下二者的区别.二者都牵涉到在派生类中与override的配合使用. 一.Virtual方法(虚方法) virtual ...
- C#面向对象基础:virtual方法,abstract方法,区别
virtual 关键字用于修饰方法.属性.索引器或事件声明,并使它们可以在派生类中被重写.默认情况下,类中的方法是非虚的,非虚的方法不能在子类中被覆盖(override),但是可以隐藏(new),但这 ...
随机推荐
- iOS:SQL
iOS虽然也有SQL,不过用得少(至少我目前是这样).大数据直接丢给后台,小的用Plist足矣. 再退一步,有FMDB,原生的也用得少了. 下面是之前学SQL时候的笔记. 1.创建 1-1).打开: ...
- linux 学习第八天
一.特殊权限 1.SUID 让命令的执行者临时获取到了所有者权限(rws) 2.SGID 让目录中新的文件的所有组,归属上级目录 3.SBIT 粘滞位 让目录内的文件只能被文件所有者删除 4.修改文件 ...
- vue 样式渲染,添加删除元素
<template> <div> <ul> <li v-for="(item,index) in cartoon" :key=" ...
- 新人成长之入门Vue.js弹窗Dialog介绍(二)
前言 在上一篇博文中介绍了Vue.js的常用指令,今天总结归纳一下弹窗Dialog的使用,弹窗经常被使用在一些表单的增删改查啊,或者弹出一些提示信息等等,在保留当前页面状态的情况下,告知用户并承载相关 ...
- thinkphp5使用workerman定时器定时爬取某站点新闻资讯等内容
1.首先通过 composer 安装workerman,在thinkphp5完全开发手册的扩展->coposer包->workerman有详细说明: #在项目根目录执行以下指令compos ...
- Django自定制分页功能
URL: """django_paginner URL Configuration The `urlpatterns` list routes URLs to views ...
- php html 静态化 缓存
<?php // // ob_start(); $cache_name = md5(__FILE__). '.html'; $cache_lifetime = 3600; // echo fil ...
- Ruby中的类
初识ruby中的类 只需要简单的两行 class Point end 如果我们此时实例化一个类那么他会有一些自省(introspection)的方法 p = Point.new p.methodes( ...
- python3 urllib爬取wallhalla网站图片
点我去我的github上看源码 简单使用静态方法爬取https://wallhalla.com/网站的图片 参考: https://blog.csdn.net/cquptcmj/article/det ...
- Docker开篇之HelloWorld
按照程序世界的惯例,我们应该以HelloWorld的程序为起点开始介绍.那么接下来我们就看看Docker的HelloWorld是如何运行的. 安装 Docker CE 由于我的系统是OSX,个人推荐使 ...