虚类的析构函数究竟做什么
What do destructors for virtual classes do exactly?
假设我们有这些类。
class A
{
public:
void doSomething() = 0;
A();
virtual ~A();
private:
vector<SomeStuff> cont;
bool yesNo;
}
class B: public A
{
public:
B();
~B();
private:
bool Byesno;
}
所以首先调用A的构造函数,然后再调用B的构造函数,当我们析构B时,首先调用B的析构函数,然后再调用A的析构函数。基本上,A的析构函数将删除B和的继承变量,B的析构函数将删除特定于类的变量。我说的对吗?
我不明白的是,如果我们甚至不能实例化A类型的对象,我们怎么能调用A的析构函数?它是如何在内部工作的?
B是A等等。将调用A的析构函数以确保清除B的A部分。您的类不使用virtual关键字,所以我不确定您为什么对虚析构函数感到疑惑,但是既然您在疑惑,这可能会有所帮助:
class A
{
public:
virtual ~A() { cout << "A::~A()" << endl; }
};
class B : public A
{
public:
~B() { cout << "B::~B()" << endl; }
};
int main()
{
A* obj = new B();
delete obj;
return 0;
}
您期望的输出将是
B::~B()
A::~A()
但是,如果没有将A的析构函数声明为virtual,则输出将简单地为
A::~A()
因此,总而言之,如果您的代码涉及到多态性,并且您希望调用指向对象的析构函数而不是指针类型本身的析构函数,则必须将基类的析构函数声明为virtual。
每个析构函数运行三个阶段:
- 用户代码
- 将类成员的销毁委托给相应的析构函数
- 将基类的销毁委托给相应的析构函数
基本类型的析构函数通常是微不足道的,即什么都不做。从技术上讲,你可以认为
B::~B() { Byesno = false; }
B::~B()
{
Byesno = false; // explicit
Byesno.~bool(); // implicit, member
A::~A(); // implicit, base class
}
A::~A()
{
yesNo.~bool(); // implicit, member
cont.~vector(); // implicit, member
}
~bool()
为空,并且将被内联,因此您可以看到的唯一调用是对~vector()
的调用。
所有这些都是叫做d'tor的另一件事。如果A
的d'tor是非虚拟的,B
的d'tor只有在被销毁的对象已知是B
对象时才会被调用:
A a;
B b;
A *ap = new B;
delete ap;
将~A()
用于a
对象(正确),~B()
用于b
对象(也正确),~A()
用于ap
指向的对象(不正确,但我们不知道更好)。如果~A()
是虚的,则d'tor调用本身将在v'表中查找,v'表中包含一个指向~B()
的指针。
相关文章:
- 传递给std::function template的template参数究竟代表什么
- C++关于指针和使用函数将它们启动到堆的行为究竟是什么?
- 当使用对象名称后带有 [] 的类对象时,您究竟会传入什么.C++
- 哪种方式更快?究竟发生了什么,我们没有看到什么?
- 当我使用 void 函数的返回值(通过强制转换函数指针)时,究竟会发生什么?
- DrawShadow 中的 Elevation 究竟有什么作用?
- 究竟是什么设置了_WIN32或_WIN64预处理器?
- GCC 的 -Wpsabi 选项究竟有什么作用?压制它意味着什么?
- 这个编译器错误究竟希望我执行什么?
- 在陈述"Implementation-defined"时,什么样的软件是"Implementation"的一部分?究竟什么是"Implementation"?
- 究竟什么是"位填充"或"填充位"?
- 究竟发生了什么,我们需要在 c++ 中双重调度/访客
- 根据标准,究竟什么是"declaration of an object"
- wchar_t究竟能代表什么
- 此模板中究竟检查了什么?
- a = !5 < a;在这一行代码中究竟做了什么?
- 绑定 API 在服务器程序中究竟做了什么
- 这个给定算法中的"basic operation"究竟是什么
- GetModuleFilenameEx返回0,getlasterror返回溢出错误.我究竟做错了什么
- 为了对象替换的目的,究竟什么构成了对象的"name"?