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

在C++中我们可以将一些类的共性编写到一个抽象的类中叫他抽象类(ABC abstract base class)
这个类中必须包含一个纯虚函数,抽象类不能定义出对象,但是可以作为其他类的基类。在抽象
类中可以对纯虚函数进行定义也可以不定义,但是注意纯虚函数一般是通过抽象类派生出来的派
生类的差异性函数原型,及不能在抽象类中实现的函数。那么抽象类的特点为:
1、至少包含一个纯虚函数
2、纯虚函数可以定义也可以不定义,但是一般是派生类之间的差异函数不能实现的函数
3、抽象类不能用于定义对象,但是可以声明抽象类的指针和引用
4、抽象类包含析构函数、构造函数。
5、纯虚函数包含虚函数的所有特点,比如向上转换时候基类指针自适应、通过vtbl
   (virtual function table)
   实现等。

那么下面说明一下纯虚函数,纯虚函数可以包含定义也可以不包含定义,当然前面说过既然成为
纯虚函数一般是不能在抽象类中实现的函数
实际上在虚函数原型中
后面加上 = 0 即可如:
vritual test(int a) = 0 ;
可以将抽象ABC类看做一种必须的接口,派生类覆盖其纯虚函数,这样迫使派生类遵守
ABC类的接口规则,让设计人员能够制定接口约定,这样确保从抽象ABC类继承的所有的
派生类支持抽象类的约定的功能接口.
我们还是以C++ Primer Plus列子的头文件作为说明

点击(此处)折叠或打开

  1. #include<iostream>
    #ifndef ACCTABC_H_
    #define ACCTABC_H_
    #include<string>
    using namespace std;

    class AcctABC
    {
            private:
                string fullName;
                    long acctNum;
                    double balance;
            protected:
                    struct Formatting
                    {
                            ios_base::fmtflags flag;
                        streamsize pr;
                    };
                    const string& FullName() const{
                            return fullName;
                    }
                    long AcctNum() const {
                            return acctNum;
                    }
                    Formatting SetFormat() const;
                    void Restore(Formatting& f) const;
            public:
                    AcctABC(const string& s="Nullbody",long an= -1,double bal= 0.0);
                    void Deposit(double amt);
                    double Balance() const{return balance;};
                    virtual void Withdraw(double amt) = 0; //pure virtual function
                    virtual void ViewAcct() const = 0;//pure virtual function
                    virtual ~AcctABC(){}
    };

    class Brass:public AcctABC
    {
            public:
                    Brass(const string& s="Nullbody",long an=-1,double bal = 0.0):AcctABC(s,an,bal){}
                    virtual void Withdraw(double amt); //redefine pure virtual function 
                    virtual void ViewAcct() const;     //redefine pure virtual function
                    virtual ~Brass(){};
    };

    class BrassPlus:public AcctABC
    {
            private:
                    double maxLoan;
                    double rate;
                    double owesBank;
            public:
                    BrassPlus(const string& s="Nullbody",long an = -1,double bal=0.0,double ml = 500,double r=0.10);
                    BrassPlus(const Brass& ba,double ml=500,double r=0.1);
                    virtual void ViewAcct() const;//redefine pure virtual function
                    virtual void Withdraw(double amt);//redefine pure virtual function
                    void ResetMax(double m){maxLoan=m;}
                    void ResetOwes(){owesBank=0;}
                    virtual ~BrassPlus(){}
    };
    #endif

显然Brass和BrassPlus中包含了很多相同点,我们将他们
抽象出来,但是他们的不同点是
virtual void Withdraw(double amt);
virtual void ViewAcct() const;
实现的不同,并且brassPlus中多了一些数据成员
所以我们抽象出了AcctABC包含了共同点,
对实现不同的函数Withdraw和ViewAcct定义为
纯虚函数
virtual void Withdraw(double amt) = 0; //pure virtual function
virtual void ViewAcct() const = 0;//pure virtual function
让他随后的继承类中自己实现

时间: 2024-10-27 11:52:26

C++继承三之纯虚函数pure virtual function的相关文章

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

纯虚函数(pure virtual), 是一个基类中的方法, 仅仅是声明, 而不包括定义, 是一个泛化概念(general concept); 是把相应的虚函数, 末尾添加"=0",该虚函数就变为纯虚函数, 可以不用添加定义; 如果是其他虚函数, 即使不使用, 也必须定义(define); 包含纯虚函数的基类, 是抽象基类(abstract base class),不能定义(define)对象(object), 仅可以作为继承使用; 代码: /* * CppPrimer.cpp * *

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++ 虚函数与纯虚函数的区别(深入分析)_C 语言

在面向对象的C++语言中,虚函数(virtual function)是一个非常重要的概念.因为它充分体现 了面向对象思想中的继承和多态性这两大特性,在C++语言里应用极广.比如在微软的MFC类库中,你会发现很多函数都有virtual关键字,也就是说, 它们都是虚函数.难怪有人甚至称虚函数是C++语言的精髓. 那么,什么是虚函数呢,我们先来看看微软的解释: 虚函数是指一个类中你希望重载的成员函数,当你用一个基类指针或引用指向一个继承类对象的时候,你调用一个虚函数,实际调用的是继承类的版本. 这个定

【C/C++学院】0823-静态联合编译与动态联合编译/父类指针子类指针释放/虚函数/纯虚函数概念以及虚析构函数/抽象类与纯虚函数以及应用/虚函数原理/虚函数分层以及异质链表/类模板的概念以及应用

静态联合编译与动态联合编译 #include <iostream> #include <stdlib.h> //散列 void go(int num) { } void go(char *str) { } //class //::在一个类中 class A { public: void go(int num) { } void go(char *str) { } }; void main() { ///auto p = go;编译的阶段,静态联编 void(*p1)(char *s

c++中虚函数和纯虚函数的作用与区别_C 语言

虚函数为了重载和多态的需要,在基类中是有定义的,即便定义是空,所以子类中可以重写也可以不写基类中的此函数! 纯虚函数在基类中是没有定义的,必须在子类中加以实现,很像java中的接口函数! 虚函数 引入原因:为了方便使用多态特性,我们常常需要在基类中定义虚函数. class Cman { public: virtual void Eat(){--}; void Move(); private: }; class CChild : public CMan { public: virtual void

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

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

类的分解,抽象类与纯虚函数的需要性

为了不模糊概念在这里我们就简单的阐述一下类的分解,前面的教程我们着重讲述了类的继承,继承的特点就是,派生类继承基类的特性,进行结构扩张,这种逐步扩张,逐步在各派生类中分解彼此不同特性的过程其实就是类的分解. 分解过程笔者在这里不想再拿代码进行过多阐述分析了,意思说到,对于逐步分解,逐步扩张的思想就靠大家自己思考了. 拿前面交通工具类的程序进行思考,由交通工具派生出来的汽车类,飞机类,是具备更具体特性的描述的类,而对于交通工具这一个基类来说,它的特性是模糊的,广泛的,如果建立一个交通工具类的对象并

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

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