Возьмите следующую (надуманную) иерархию классов, которая выводит на консоль из конструкторов и деструкторов:
#include <iostream>
class A {
public:
A() { std::cout << "A"; }
~A() { std::cout << "~A"; }
};
class B : public A {
public:
B() { std::cout << "B"; }
~B() { std::cout << "~B"; }
};
void func(A a) { }
int main() {
B b;
func(b);
std::cout << "X";
return 0;
}
Скомпилированный под linux с gcc, он печатает AB~AX~B~A
, как ожидалось (~A
, напечатанный до X
, является результатом значения pass-by-value до func
, который создает копию, которая разрушается, когда функция возвращается).
Но скомпилированный под окнами VS2008, он печатает AB~A~AX~B~A
- откуда берется дополнительная ~A
? Он исчезает, если явно определена копия xtor A(A& that) {};
или если деструктор объявлен виртуальным (как и должно быть, возможно).