C++关于虚函数为什么会报错?


#include<iostream>
using namespace std;
class Huahome
{
public:
    virtual void Show() = 0;
    virtual ~Huahome() {};
};

class Huaba :public Huahome
{
public:
    Huaba() { cout << "花爸会武功" << endl; }
    void Show() { cout << "花爸当兵" << endl; }
    ~Huaba() { cout << "析构" << endl; }
};
class Huadi :virtual public Huaba
{
public:
    Huadi() { cout << "花弟年轻" << endl; }
    void Show() { cout << "花弟当兵" << endl; }
    ~Huadi() { cout << "析构" << endl; }
};

class Huamei :virtual public Huaba
{
public:
    Huamei() { cout << "花姐扮男装" << endl; }
    void Show() { cout << "花姐当兵" << endl; }
    ~Huamei() { cout << "析构" << endl; }
};

int mian()
{
    Huahome* PHua;
    Huaba ba;
    PHua = &ba;
    PHua->Show();
    cout << "****************************************************" << endl;
    Huadi di;
    PHua = &di;
    PHua->Show();
    cout << "****************************************************" << endl;
    Huamei mei;
    PHua = &mei;
    PHua->Show();
    cout << "****************************************************" << endl;
    return 0;
}

img

这个为什么报错呀,是有什么问题吗?

main 方法, 不是 mian

img

  • 帮你找了个相似的问题, 你可以看下: https://ask.csdn.net/questions/7700388
  • 你也可以参考下这篇文章:【C++】构造函数 无参构造函数 有参构造函数 拷贝构造函数内联函数
  • 除此之外, 这篇博客: C++ 常见问题中的 为什么析构函数可以为虚函数,如果不设为虚函数可能会存在什么问题? 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 首先析构函数可以为虚函数,而且当要使用基类指针或引用调用子类时,最好将基类的析构函数声明为虚函数,否则可以存在内存泄露的问题。

    每个析构函数(不加 virtual) 只负责清除自己的成员。
    基类指针可以指向派生类的对象(多态性),如果删除该指针delete []p;就会调用该指针指向的派生类析构函数,而派生类的析构函数又自动调用基类的析构函数,这样整个派生类的对象完全被释放。如果析构函数不被声明成虚函数,则编译器实施静态绑定,在删除基类指针时,只会调用基类的析构函数而不调用派生类析构函数,这样就会造成派生类对象析构不完全,造成内存泄漏。所以,将析构函数声明为虚函数是十分必要的。

    反正你在写一个类时,将其析构函数写为虚函数总不会错,一样重载的。

    举例说明:
    子类B继承自基类A:

    A *p = new B; delete p;
    
    1. 此时,如果类A的析构函数不是虚函数,那么delete p;将会仅仅调用A的析构函数,只释放了B对象中的A部分,而派生出的新的部分未释放掉。
    2. 如果类A的析构函数是虚函数,delete p; 将会先调用B的析构函数,再调用A的析构函数,释放B对象的所有空间。

    补充:

    B *p = new B; delete p;
    

    此时也是先调用B的析构函数,再调用A的析构函数。

  • 您还可以看一下 黄强老师的C++模板进阶课程中的 什么是模板?小节, 巩固相关知识点