虚拟析构函数,我在派生的 class 中没有析构函数会发生什么?
Virtual destructor, what would happen I didnt have a destructor in the derived class?
我刚上完关于虚拟析构函数的课,我有一个问题。
假设我们有以下代码:
#include <iostream>
class Base {
public:
virtual void fun() { std::cout << "Base Fun" << std::endl; };
virtual ~Base() { std::cout << "Base Destructor called" << std::endl; };
};
class Derived : public Base {
public:
virtual void fun() { std::cout << "Derived Fun" << std::endl; };
~Derived() { std::cout << "Derived Destructor called" << std::endl; };
};
int main()
{
Base* b = new Base();
Base* d = new Derived();
b->fun();
d->fun();
delete b;
delete d;
return 0;
}
我们看到我们的 Base 类中有一个 Virtual 析构函数,这意味着当我们在 main 中删除 d 时,将调用 Base class 析构函数和 Derived class 析构函数被称为..
**但是如果我们在派生 class 中没有析构函数怎么办,我们仍然想要虚拟析构函数 + 我们仍然想删除 d。那么会发生什么?派生的 class 是否会自动“创建”一个析构函数,然后析构函数会处理资源 - d 并将其删除吗?
所有 类 都有析构函数。如果您不显式编写一个,那么编译器将隐式生成它。因此,您询问“如果我没有析构函数”的情况不存在。
and would the whole program still work as earlier?
它可以工作,但方式不完全相同,因为隐式生成的析构函数不会打印您的析构函数打印的字符串。
我刚上完关于虚拟析构函数的课,我有一个问题。
假设我们有以下代码:
#include <iostream>
class Base {
public:
virtual void fun() { std::cout << "Base Fun" << std::endl; };
virtual ~Base() { std::cout << "Base Destructor called" << std::endl; };
};
class Derived : public Base {
public:
virtual void fun() { std::cout << "Derived Fun" << std::endl; };
~Derived() { std::cout << "Derived Destructor called" << std::endl; };
};
int main()
{
Base* b = new Base();
Base* d = new Derived();
b->fun();
d->fun();
delete b;
delete d;
return 0;
}
我们看到我们的 Base 类中有一个 Virtual 析构函数,这意味着当我们在 main 中删除 d 时,将调用 Base class 析构函数和 Derived class 析构函数被称为..
**但是如果我们在派生 class 中没有析构函数怎么办,我们仍然想要虚拟析构函数 + 我们仍然想删除 d。那么会发生什么?派生的 class 是否会自动“创建”一个析构函数,然后析构函数会处理资源 - d 并将其删除吗?
所有 类 都有析构函数。如果您不显式编写一个,那么编译器将隐式生成它。因此,您询问“如果我没有析构函数”的情况不存在。
and would the whole program still work as earlier?
它可以工作,但方式不完全相同,因为隐式生成的析构函数不会打印您的析构函数打印的字符串。