美文网首页
父类析构函数和普通函数声明为纯虚或虚函数时调用子类方法

父类析构函数和普通函数声明为纯虚或虚函数时调用子类方法

作者: csranger | 来源:发表于2019-11-02 21:22 被阅读0次

[TOC]

父类析构函数和普通函数声明为纯虚或虚函数时调用子类方法

例子如代码所示

  1. B 是 A 子类
  2. A *a = new B()

注意

  1. 父类的普通成员函数是纯虚函数,父类可以也可以不实现此方法,只是表示子类必须实现这个方法,父类指针只会调用子类的这个方法实现,不会调用父类的。

  2. 父类的普通成员函数是虚函数,父类必须实现此方法,同时表示子类可以也可以不实现这个方法,如果子类实现了此方法,父类指针会调用子类的这个方法实现;如果子类没实现,父类指针会调用父类自身的方法实现。

  3. 父类的普通成员函数不是虚函数,父类实现了,无论指针是否重写了此方法,父类指针只会调用自身的方法实现。

  4. 父类的析构函数是纯虚函数,父类必须实现此析构函数,子类可实现可不实现,因为不实现系统会默认生成一个,delete a 时,先执行子类的析构函数,再执行父类自身的析构函数。

  5. 父类的析构函数是虚函数,父类必须实现此析构函数,子类可实现可不实现,因为不实现系统会默认生成一个,delete a 时,会先执行子类的析构函数,再执行父类自身的析构函数。(可见纯虚析构函数和虚析构函数一样)

  6. 父类的析构函数不是虚函数,父类必须实现此析构函数,delete a 时,只会执行父类自身的析构函数。

#include <iostream>
using namespace std;

class A
{
public:
    A(int size) : m_a_size(size) { m_a = new int[size]; }
    virtual ~A() = 0;
    virtual void F1() = 0;
    virtual void F2();
    void F3() { cout << "A F3\n" << endl; }
    void F4() { cout << "A F4\n" << endl; }

private:
    int *m_a;
    int m_a_size;
};

A::~A()
{
    cout << "delete m_a" << endl;
    delete[] m_a;
}

void A::F1() { cout << "A F1\n" << endl; }

void A::F2() { cout << "A F2\n" << endl; }

class B : public A
{
public:
    B(int a_size, int b_size) : A(a_size), m_b_size(b_size)
    {
        m_b = new int[b_size];
    }
    ~B();
    void F1() { cout << "B F1\n" << endl; }
    void F3() { cout << "B F3\n" << endl; }

private:
    int *m_b;
    int m_b_size;
};

B::~B()
{
    cout << "delete m_b" << endl;
    delete[] m_b;
}

int main()
{
    // 父类析构函数是否虚函数区别
    A *a1 = new B(5, 10);
    delete a1;

    // 子类成员函数是否重写父类成员方法
    A *a2 = new B(6, 12);
    a2->F1();
    a2->F2();
    a2->F3();
    a2->F4();
    return 0;
}

相关文章

网友评论

      本文标题:父类析构函数和普通函数声明为纯虚或虚函数时调用子类方法

      本文链接:https://www.haomeiwen.com/subject/pcbhbctx.html