虚析构的例子
时间: 2023-08-12 21:17:02 浏览: 47
虚析构函数通常用于基类中,以便在通过基类指针删除派生类对象时正确地调用派生类析构函数,避免内存泄漏。
以下是一个简单的虚析构函数的例子:
```c++
class Base {
public:
virtual ~Base() {
cout << "Base destructor" << endl;
}
};
class Derived : public Base {
public:
~Derived() {
cout << "Derived destructor" << endl;
}
};
int main() {
Base* ptr = new Derived();
delete ptr;
return 0;
}
```
在上面的示例中,基类 `Base` 声明了虚析构函数 `~Base()`,因此在通过指向基类的指针 `ptr` 删除派生类对象 `Derived` 时,会正确地调用派生类析构函数 `~Derived()`。
当程序运行时,输出如下:
```
Derived destructor
Base destructor
```
可以看到,析构函数的调用顺序与对象创建的相反顺序相同。
相关问题
C++ 虚函数 虚析构
虚函数是在基类中声明的,可以在派生类中被重写的函数。它允许通过基类指针或引用调用派生类对象的特定实现。在C++中,使用关键字`virtual`来声明虚函数。
虚析构函数是一个虚函数,用于在继承关系中正确释放资源。当一个派生类对象通过基类指针进行删除时,如果基类的析构函数不是虚函数,只会调用基类的析构函数而不会调用派生类的析构函数,可能导致资源泄漏。因此,为了正确释放资源,我们需要将基类的析构函数声明为虚函数。
例如,考虑以下代码:
```cpp
class Base {
public:
virtual ~Base() {
// 析构函数的实现
}
};
class Derived : public Base {
public:
~Derived() {
// 派生类析构函数的实现
}
};
```
在这个例子中,`~Base()` 被声明为虚析构函数,所以当通过基类指针删除派生类对象时,将会正确调用 `~Derived()` 进行资源的释放。
c++中基类的虚析构函数要提供定义吗
在C++中,如果一个类有虚函数,那么它的析构函数通常需要被声明为虚析构函数。当一个派生类对象通过一个基类指针被删除时,如果基类的析构函数不是虚的,那么只会调用基类的析构函数,而不会调用派生类的析构函数,这可能导致资源泄漏。
虚析构函数应该提供一个定义,即使它可能是一个空实现。这是因为C++编译器需要知道虚析构函数的定义,以便正确地生成对象的析构代码。如果只是在类的声明中声明了虚析构函数而没有提供定义,那么链接过程中可能会出现错误。
下面是一个示例:
```cpp
class Base {
public:
virtual ~Base() {} // 虚析构函数的定义
};
class Derived : public Base {
public:
~Derived() {} // 派生类的析构函数
};
int main() {
Base* ptr = new Derived();
delete ptr; // 通过基类指针删除派生类对象
return 0;
}
```
在这个例子中,如果`Base`类的析构函数不是虚的,那么`Derived`类的析构函数将不会被调用,从而导致派生类对象中的资源无法正确释放。通过将基类的析构函数声明为虚析构函数,并提供一个定义,可以确保正确地调用派生类的析构函数。