c++: C++虚函数和纯虚函数

1. 纯虚函数

1.1 定义

纯虚函数是在基类中声明的虚函数,它在基类中没有定义,但要求任何派生类(继承类)都要定义自己的实现方法。在基类中实现纯虚函数的方法是在函数原型后加=0
定义纯虚函数的目的在于,使派生类仅仅只是继承函数的接口。

1.2 格式

virtual <函数返回类型> 函数名 (参数表) = 0;

1.3 例子

//基类Base
class Base
{
    public:
        //普通函数
        void f1(int x)
        { 
                cout << "\nBase::f1(int) " << x << endl;
        } 
        //虚函数
        virtual void f2(int x)
        {
                cout << "Base::f2(int)"<< x << endl;
        } 
        //纯虚函数,将由子类实现
        virtual void f3(int x)=0;
};

2. 虚函素

2.1 定义

在某基类中声明为 virtual 并在一个或多个派生类中被重新定义成员函数

2.2 格式

virtual <函数返回类型> 函数名 (参数表)
{
    函数体;
};

实现多态性,通过指向派生类的基类指针或引用,访问派生类中同名覆盖成员函数

2.3 例子

class A
{
public:
        //虚函数
        virtual void f2(int x)
        {
                cout << "Base::f2(int)"<< x << endl;
        } 
};

3.混合例子:

3.1 基类

#include <iostream>
using namespace std;
//基类Base
class Base
{
    public:
        //普通函数
        void f1(int x)
        { 
                cout << "Base::f1(int) " << x << endl;
        } 
        //虚函数
        virtual void f2(int x)
        {
                cout << "Base::f2(void)"<< x << endl;
        } 
        //纯虚函数,将由子类实现
        virtual void f3(int x)=0;

};

3.2 派生类

//继承Derived
class Derived:public Base
{
    public:
        void f1(int x)
        {
                cout<<"\nDerived:g1(int)"<< x << endl;
        }
        //覆盖Base的f2
        void f2(int x)
        {
                cout<<"Derived:g2(int)"<< x << endl;
        }
        //在子类中被重载,以多态的形式被调用,实现Base的纯虚函数
        //a.编译时多态性:通过重载函数实现
        //b 运行时多态性:通过虚函数实现。
        void f3(int x)
        {
                cout<<"Derived:g3(int)"<< x << endl;
        }
};

3.3 主函数

int main(int argc, char **argv)
{
       Derived *pderived = new Derived;
       pderived->f1(1);
       pderived->f2(2);
       pderived->f3(3);


       Base *pbase = new Derived; 
       pbase->f1(1);
       pbase->f2(2);
       pbase->f3(3); 

       Derived derived;
       derived.f1(1);
       derived.f2(2);
       derived.f3(3);

       //Base base; //有纯虚函数不能声明
       //Base *base = new base; //有纯虚函数不能new
       //base.f1(1);
       //base.f2(2);
       //base.f3(3);       
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值