C++虚函数与纯虚函数

来源:互联网 发布:c语言void函数返回值 编辑:程序博客网 时间:2024/05/22 07:58

C++中虚函数与纯虚函数都是为了实现多态性而引入的,这里谈谈自己对虚函数与纯虚函数的一点理解。

在基类中将某函数声明为虚函数或者纯虚函数后,则子类中该函数自动成为虚函数。

虚函数必须在基类中实现,这样子类中可以实现,也可以不用实现该函数,根据实际需要。
纯虚函数在基类中可以实现,也可以不实现,子类中必须有实现。实际上纯虚函数在基类中的实现是没有意义的,因为含有纯虚函数的类是抽象类,抽象类是不能创建对象的,也就无法调用到该纯虚函数。当然,有的小伙伴可能会想将纯虚函数定义为静态的(即用static修饰),不就可以通过类名去调用了吗?其实不然,C++引入虚函数、纯虚函数的目的是为了实现运行时的多态性,这种多态性需要通过运行时this指针的移动去实现的,而静态成员函数属于类所有的,没有this指针。虚函数不能定义为静态的。

这里有个特殊的函数需要提一下,析构函数。
在基类中,一定要将析构函数声明为虚函数。因为我通常使用多态的方式是定义一个基类指针去指向子类的对象,正是由于虚函数的作用,程序运行时基类的指针会根据需要去调用子类相应的函数,若不将基类的析构函数声明为虚函数,则在子类对象被释放时,基类指针只会调用基类的析构函数,而不会去调用子类的析构函数。

本人语言表达水平有限,说的可能有点绕,上代码示例辅助理解。

#include <iostream>class Animal{public:    //基类的析构函数必须声明为虚函数。    //若要将基类的析构函数声明为纯虚函数,则必须有实现,否则编译失败    virtual ~Animal() = 0;   //这里作为示例,将析构函数声明为纯虚函数    Animal(){}public:    virtual void Run()    {        std::cout << "Animal Run ..." << std::endl;    }    virtual void Speak() = 0;  //普通函数声明为纯虚函数是可以不需要实现的(实际上实现也没意义)};Animal::~Animal(){}  //因为上面已将该析构函数声明为纯虚函数,这里必须有实现void Animal::Speak()  //该实现是没有意义的,建议不要去实现普通的纯虚函数{    std::cout << "Animal Speak ..." << std::endl;}class Cat: public Animal{public:    Cat(){}    ~Cat(){};public:    //这里Speak()函数必须有实现,Run()函数则可以继承基类    void Speak()    {        std::cout << "喵喵喵 ..." << std::endl;    }};int main(){    Animal* aml = new Cat;    aml->Run();    aml->Speak();    return 0;}
1 0