Возьмите следующую (надуманную) иерархию классов, которая выводит на консоль из конструкторов и деструкторов:
#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) {}; или если деструктор объявлен виртуальным (как и должно быть, возможно).