I have the code:
class A1 {
public:
A1() { cout << "A1"; }
virtual ~A1() { cout << "~A1"; }
};
class A2 {
public:
A2() { cout << "A2"; }
~A2() { cout << "~A2"; }
};
class B : public A1, A2 {
public:
B() { cout << "B"; }
~B() { cout << "~B"; }
};
int main() {
A1* pa1 = new B;
delete pa1;
return 0;
}
It works totally fine because I use a virtual destructor. Output: A1A2B~B~A2~A1 as expected.
Then I remove virtual:
class A1 {
public:
A1() { cout << "A1"; }
~A1() { cout << "~A1"; }
};
class A2 {
public:
A2() { cout << "A2"; }
~A2() { cout << "~A2"; }
};
class B : public A1, A2 {
public:
B() { cout << "B"; }
~B() { cout << "~B"; }
};
int main() {
A1* pa1 = new B;
delete pa1;
return 0;
}
And it outputs this: A1A2B~A1, which I don't understand. I thought it was supposed to output A1A2B since ~B() isn't going to run, and we don't have an instance of A1, so ~A1() should not be invoked as well. And then, why only ~A1() is running, without ~A2()? Why does it behave like this?