21xrx.com
2024-11-22 07:39:44 Friday
登录
文章检索 我的文章 写文章
C++中的基类析构函数与虚函数
2023-07-05 08:18:30 深夜i     --     --
C++继承 基类析构函数 虚函数 动态绑定 内存泄露

在C++中,如果一个类是另一个类的派生类,那么其析构函数应该被声明为虚函数。这是因为在使用继承和多态性时,需要保证正确的对象被销毁。如果一个函数不是虚函数,那么在程序运行时可能会出现未定义的行为。

使用虚析构函数的好处是在删除派生类对象时会先调用派生类的析构函数,然后调用基类的析构函数。如果不使用虚析构函数,则只会调用派生类的析构函数,而基类的析构函数不会被调用。这可能会导致派生类中的资源没有被释放,从而导致内存泄漏。

以下是一个基类和派生类的示例,在该示例中,Animal是一个基类,Cat和Dog是派生类:


class Animal

{

public:

  Animal()

  

    std::cout << "构造 Animal 对象" << std::endl;

  

  virtual ~Animal()

  

    std::cout << "销毁 Animal 对象" << std::endl;

  

};

class Cat : public Animal

{

public:

  Cat()

  

    std::cout << "构造 Cat 对象" << std::endl;

  

  ~Cat()

  

    std::cout << "销毁 Cat 对象" << std::endl;

  

};

class Dog : public Animal

{

public:

  Dog()

  

    std::cout << "构造 Dog 对象" << std::endl;

  

  ~Dog()

  

    std::cout << "销毁 Dog 对象" << std::endl;

  

};

int main()

{

  Animal* animal = new Cat();

  delete animal;

}

在上面的示例中,首先创建了一个Animal指针,并将其指向Cat对象。然后,将该指针用delete操作符删除。在删除对象时,会调用Cat类的析构函数,并且由于Animal的析构函数被声明为虚函数,因此还会调用Animal类的析构函数。输出如下:


构造 Animal 对象

构造 Cat 对象

销毁 Cat 对象

销毁 Animal 对象

可以看到,在删除Cat对象时,先会调用Cat类的析构函数,然后会调用Animal类的析构函数。这正是我们所期望的,因为Animal是Cat的基类。

在使用继承和多态性时,记得为基类的析构函数声明为虚函数,在删除派生类对象时,会调用基类和派生类的析构函数,从而保证正确的资源释放。

  
  

评论区

{{item['qq_nickname']}}
()
回复
回复