我对大多数OO理论有了深刻的理解,但让我困惑的一件事是虚拟析构函数.
我认为无论什么以及链中的每个对象,析构函数总是会被调用.
你什么时候打算让它们成为虚拟的?为什么?
我有这个代码:
class Class {
public:
virtual ~Class() {}
};
int main()
{
Class* object = new Class();
delete object;
}
Run Code Online (Sandbox Code Playgroud)
我使用Visual C++ 10编译并获取delete object语句的反汇编:
delete object;
test eax,eax
je wmain+23h (401041h)
mov edx,dword ptr [eax]
push 1
mov ecx,eax
call dword ptr [edx]
Run Code Online (Sandbox Code Playgroud)
这对于实际的析构函数:
Class::`scalar deleting destructor':
test byte ptr [esp+4],1
push esi
mov esi,ecx
mov dword ptr [esi],offset Class::`vftable' (402100h)
je Class::`scalar deleting destructor'+18h (401018h)
push esi
call dword ptr [__imp_operator delete (4020A8h)]
pop ecx
mov eax,esi …Run Code Online (Sandbox Code Playgroud) 此代码是否导致定义的行为?
class A {
int x;
};
class B {
short y;
};
class C {
double z;
};
class D : public A, public B, public C {
float bouncy;
};
void deleteB(B *b) {
delete b;
}
void is_it_defined() {
D *d = new D;
deleteB(d);
B *b = new D; // Is this any different?
delete b;
}
Run Code Online (Sandbox Code Playgroud)
如果没有定义,为什么不呢?如果是,它定义的是什么以及为什么?最后,如果定义了实现,您能举例说明一个常见的实现可能会定义行为吗?