C++中的纯虚函数(pure virtual) 和抽象基类(abstract base class)

纯虚函数(pure virtual), 是一个基类中的方法, 仅仅是声明, 而不包括定义, 是一个泛化概念(general concept);

是把相应的虚函数, 末尾添加"=0",该虚函数就变为纯虚函数, 可以不用添加定义;

如果是其他虚函数, 即使不使用, 也必须定义(define);

包含纯虚函数的基类, 是抽象基类(abstract base class),不能定义(define)对象(object), 仅可以作为继承使用;

代码:

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

/*eclipse cdt*/
/*更多精彩内容:http://www.bianceng.cnhttp://www.bianceng.cn/Programming/cplus/*/
#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 Disc_quote : public Quote { //抽象基类
public:
    Disc_quote() = default;
    Disc_quote (const std::string& book, double price, std::size_t qty, double disc) :
        Quote(book, price), quantity (qty), discount (disc) {}
    double net_price (std::size_t) const = 0; //纯虚函数
protected:
        std::size_t quantity = 0;
        double discount = 0.0;
};  

class Bulk_quote final : public Disc_quote { //final限定词, 无法被继承
public:
    Bulk_quote() = default;
    Bulk_quote(const std::string&book, double p, std::size_t qty, double disc) :
        Disc_quote(book, p, qty, disc) {} //使用基类的构造器
    double net_price(std::size_t cnt) const override;
};  

double Bulk_quote::net_price(std::size_t cnt) const
{
    if (cnt >= quantity)
        return cnt * (1-discount) * price;
    else
        return cnt * price;
}  

double print_total(std::ostream &os, const Quote& item, std::size_t n)
{
    double ret = item.net_price(n);
    os << "ISBN: " << item.isbn() << " # sold: " << n << " total due: " << ret << std::endl;
    return ret;
}  

int main (void) {  

    Quote q("CppPrimer", 99);
    Bulk_quote bq("CppPrimer", 99, 10, 0.5);
    Quote& rq = bq;
    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;
    std::cout << "R Quote net_price : " << rq.net_price(n) << std::endl;  

    //动态绑定
    Quote base("EffectiveCpp", 50);
    print_total(cout, base, 10);
    Bulk_quote derived("EffectiveCpp", 50, 5, .19);
    print_total(cout, derived, 10);  

    //复制-赋值操作, 派生类->基类转换
    base = derived;
    std::cout << "net_price : " << base.net_price(20) << std::endl;  

    double undiscounted = derived.Quote::net_price(20); //派生类使用基类的虚函数
    std::cout << "undiscounted : " << undiscounted << std::endl;
    return 0;  

}

作者:csdn博客 Spike_King

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索const
, double
, 径向基函数
, std
纯虚函数
纯虚函数和抽象类、抽象类 纯虚函数、abstract抽象类、抽象基类、c 抽象基类,以便于您获取更多的相关知识。

时间: 2024-12-21 22:24:37

C++中的纯虚函数(pure virtual) 和抽象基类(abstract base class)的相关文章

C++继承三之纯虚函数pure virtual function

在C++中我们可以将一些类的共性编写到一个抽象的类中叫他抽象类(ABC abstract base class) 这个类中必须包含一个纯虚函数,抽象类不能定义出对象,但是可以作为其他类的基类.在抽象 类中可以对纯虚函数进行定义也可以不定义,但是注意纯虚函数一般是通过抽象类派生出来的派 生类的差异性函数原型,及不能在抽象类中实现的函数.那么抽象类的特点为: 1.至少包含一个纯虚函数 2.纯虚函数可以定义也可以不定义,但是一般是派生类之间的差异函数不能实现的函数 3.抽象类不能用于定义对象,但是可以

深入解析C++编程中的纯虚函数和抽象类_C 语言

C++纯虚函数详解 有时在基类中将某一成员函数定为虚函数,并不是基类本身的要求,而是考虑到派生类的需要,在基类中预留了一个函数名,具体功能留给派生类根据需要去定义. 纯虚函数是在声明虚函数时被"初始化"为0的函数.声明纯虚函数的一般形式是 virtual 函数类型 函数名 (参数表列) = 0; 关于纯虚函数需要注意的几点: 纯虚函数没有函数体: 最后面的"=0"并不表示函数返回值为0,它只起形式上的作用,告诉编译系统"这是纯虚函数"; 这是一个

C++实践参考——形状类族的中的纯虚函数

返回:贺老师课程教学链接  项目要求 [项目-形状类族的中的纯虚函数]写一个程序,定义抽象基类Shape,由它派生出3个派生类,Circle(圆形).Rectangle(矩形).Triangle(三角形).用如下的main()函数,求出定义的几个几何体的面积和.  int main() { Circle c1(12.6),c2(4.9);//建立Circle类对象c1,c2,参数为圆半径 Rectangle r1(4.5,8.4),r2(5.0,2.5);//建立Rectangle类对象r1,r

C++第14周项目2 - 形状类族的中的纯虚函数

课程首页地址:http://blog.csdn.net/sxhelijian/article/details/7910565,本周题目链接:http://blog.csdn.net/sxhelijian/article/details/8987478 [项目2]写一个程序,定义抽象基类Shape,由它派生出3个派生类,Circle(圆形).Rectangle(矩形).Triangle(三角形).用如下的main()函数,求出定义的几个几何体的面积和.  int main() { Circle c

基础:C++中的虚函数和纯虚函数用法

1. 虚函数和纯虚函数可以定义在同一个类(class)中,含有纯虚函数的类被称为抽象类(abstract class),而只含有虚函数的类(class)不能被称抽象类 2. 虚函数可以被直接使用,也可以被子类(sub class)重载以后以多态的形式调用,而纯虚函数必须在子类(sub class)中实现该函数才可以使用. 3. 虚函数和纯虚函数都可以在子类(sub class)中被重载,以多态的形式被调用. 4. 虚函数和纯虚函数通常存在于抽象基类(abstract base class -AB

C++中虚函数与纯虚函数的用法_C 语言

本文较为深入的分析了C++中虚函数与纯虚函数的用法,对于学习和掌握面向对象程序设计来说是至关重要的.具体内容如下: 首先,面向对象程序设计(object-oriented programming)的核心思想是数据抽象.继承.动态绑定.通过数据抽象,可以使类的接口与实现分离,使用继承,可以更容易地定义与其他类相似但不完全相同的新类,使用动态绑定,可以在一定程度上忽略相似类的区别,而以统一的方式使用它们的对象. 虚函数的作用是实现多态性(Polymorphism),多态性是将接口与实现进行分离,采用

C++ 在继承中虚函数、纯虚函数、普通函数,三者的区别

1.虚函数(impure virtual) C++的虚函数主要作用是"运行时多态",父类中提供虚函数的实现,为子类提供默认的函数实现. 子类可以重写父类的虚函数实现子类的特殊化. 如下就是一个父类中的虚函数: class A { public: virtual void out2(string s) { cout<<"A(out2):"<<s<<endl; } }; 2.纯虚函数(pure virtual) C++中包含纯虚函数的

c++虚函数和纯虚函数的区别

虚函数为了重载和多态的需要,在基类中是由定义的,即便定义是空,所以子类中可以重写也可以不写基类中的函数! 纯虚函数在基类中是没有定义的,必须在子类中加以实现,很像java中的接口函数! 多态是C++的重要特性,通过基类指针来访问派生类的函数. 虚函数就是为了实现这功能而定义的函数,虚函数可以在定义时实现也可以不实现,定义了虚函数的类可以实例化. 纯虚函数更多的是表示接口的含义,纯虚函数定义时不能实现,需要在派生的子类中实现且必须实现,含有纯虚函数的类不能实例化. 虚析构函数与虚函要成对出现,以便

[面试题]虚函数和纯虚函数

①虚函数 C++中的虚函数的作用主要是实现了多态的机制.关于多态,简而言之就是用父类型的指针指向其子类的实例,然后通过父类的指针调用实际子类的成员函数.这种技术可以让父类的指针有"多种形态",这是一种泛型技术.        如果调用非虚函数,则无论实际对象是什么类型,都执行基类类型所定义的函数.非虚函数总是在编译时根据调用该函数的对象,引用或指针的类型而确定.如果调用虚函数,则直到运行时才能确定调用哪个函数,运行的虚函数是引用所绑定或指针所指向的对象所属类型定义的版本. 虚函数必须是