虚函数

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/DT_Zhangshuo/article/details/79444029


#include <stdio.h>
class Base
{
public:
    virtual void Init()
    {
        printf("Base Init\n");
    }
    void func()
    {
        printf("Base func\n");
    }
};
class Derived: public Base
{
public:
    virtual void Init()
    {
        printf("Derived Init\n");
    }
    void func()
    {
        printf("Derived func\n");
    }
};

int main()
{
    Base *d=new Derived;
    Base a;
    Derived b;
    d->Init();//如果定义的是虚函数则输出子类的
    d->func();//否则输出父类的

    a.Init();
    a.func();
    b.Init();
    b.func();
    return 0;
}
为了方便使用多态特性,我们需要在基类中定义虚拟函数,实现动态单分派类型多态的方式
动态:一个类函数的调用并不是在编译时刻被确定的,而是在运行时决定
单分派:基于一个类型去选择调用哪一个函数
子类型多态:以子类型超类型关系实现多态
虚函数只能借助于指针或者引用来达到多态的效果。

虚函数使用需要注意的几点
1、在很多情况下,基类本身生成对象是不合情理的。将函数定义为纯虚函数,则编译器要求在派生类中必须予以重写以实现多态性。
2、虚函数是C++中用于实现多态(polymorphism)的机制。核心理念就是通过基类访问派生类定义的函数。
3、虚函数声明如下:virtual ReturnType FunctionName(Parameter);虚函数必须实现,如果不实现,编译器将报错,错误提示为:unresolved external symbol "public: virtual void __thiscall ClassName::virtualFunctionName(void)"
4、对于虚函数来说,父类和子类都有各自的版本。由多态方式调用的时候动态绑定。
5、纯虚函数声明如下: virtual void funtion1()=0; 纯虚函数一定没有定义,纯虚函数用来规范派生类的行为,即接口。包含纯虚函数的类是抽象类,抽象类不能定义实例,但可以声明指向实现该抽象类的具体类的指针或引用。
6、实现了纯虚函数的子类,该纯虚函数在子类中就编程了虚函数,子类的子类即孙子类可以覆盖该虚函数,由多态方式调用的时候动态绑定。
7、在有动态分配堆上内存的时候,析构函数必须是虚函数,但没有必要是纯虚的。
8、析构函数应当是虚函数,将调用相应对象类型的析构函数,因此,如果指针指向的是子类对象,将调用子类的析构函数,然后自动调用基类的析构函数。
9、只有成员函数才可以是虚拟的,友元不是成员函数,因此友元不能是虚拟函数。但可以通过让友元函数调用虚拟成员函数来解决友元的虚拟问题。
阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页