C++学习笔记6——类的多态

简介:

  同一操作作用于不同的对象,可以有不同的解释,产生不同的执行结果。在运行时,可以通过指向基类的指针,来调用实现派生类中的方法。

虚函数:

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

class Base
{
public:
    virtual void print(void)
    {
    //...
    }
};

class Derived : public Base
{
public:
    virtual void print(void)
    {
    //...         
    }
};   

PS:

  1、当类中声明虚函数时,编译器会在类中生成一个虚函数表。

  2、虚函数表是一个存储类成员函数指针的数据结构。

  3、虚函数表是由编译器自动生成与维护的。

  4、virtual成员函数会被编译器放入虚函数表中。

  5、当存在虚函数时,每个对象中都有一个指向虚函数表的vfptr指针。

  6、vfptr指针一般作为类对象的第一个成员 。

  7、使用VS开发人员命令提示可以查看内存布局和虚函数表。

cl /d1 reportSingleClassLayout类名 CPP文件名 

纯虚函数:

  纯虚函数是一种特殊的虚函数,在许多情况下,在基类中不能对虚函数给出有意义的实现,而把它声明为纯虚函数,它的实现留给该基类的派生类去做。这就是纯虚函数的作用。起到定义接口的作用。

class Base
{
public:
    virtual void print(void) = 0;
};

虚析构函数:

  通过基类指针析构所以派生类的资源。如果基类的析构函数不是虚函数,则delete一个指向派生类对象的基类指针只会释放基类申请的内存。

class Base
{
public:    
    virtual ~Base()
    {
    }
};

Demo:

#include <iostream>
using namespace std;

class Base
{
public:
    Base()
    {
        cout << "Base构造函数" << endl;
    }
    virtual ~Base()
    {
        cout << "Base析构函数" << endl;
    }
    virtual void print(void)
    {
        cout << "Base" << endl;
    }
};

class Derived : public Base
{
public:
    Derived()
    {
        cout << "Derived构造函数" << endl;
    }
    ~Derived()
    {
        cout << "~Derived析构函数" << endl;
    }
    virtual void print(void)
    {
        cout << "Derived" << endl;
    }
};

void show(Base *pb)
{
    pb->print();
}

int main()
{
    Base *pb = new Base;
    show(pb);                //输出Base
    delete pb;

    Base *pd = new Derived;
    show(pd);                //输出Derived
    delete pd;
    system("pause");
    return 0;
}
原文地址:https://www.cnblogs.com/codelu/p/4855057.html