Я получил простую программу, как это:Почему результат отличается от того, что я ожидаю?
#include "stdafx.h"
#include <iostream>
using namespace std;
int main()
{
class B {
protected:
int data = 0;
public:
B() { cout << "B() ctor\n";}
virtual ~B() { cout << "~B()\n"; }
virtual void method() { cout << "data in B: " << data << "\n"; }
};
class A : public B
{
int dataA = 2;
public:
A() { cout << "A() ctor\n"; }
~A() { cout << "~A()\n"; }
void method() { cout << "data in A: " << dataA << "\n"; }
};
{
B* fptrList[]{ &B{}, &A{}};
for (auto& itr : fptrList)
itr->method();
}
cin.get();
return 0;
}
Вот результат я ожидаю:
B() ctor
B() ctor
A() ctor
data in B: 0
data in A: 2
~A()
~B()
~B()
Вот реальный результат, когда я запустил эту программу:
B() ctor
~B()
B() ctor
A() ctor
~A()
~B()
data in B: 0
data in B: 0
Мои вопросы:
- Почему результат отличается от ожидаемого?
- Как вызывать метод() после вызова ~ A() и ~ B()?
- Почему метод() класса B вызывается дважды?
Это просто UB, попробуйте объяснить, что поведение бессмысленно. – songyuanyao
Я так не думаю. Вы видите, что вызовы метода() получили успех и распечатали правильные данные. Если эти объекты фактически уничтожены, вызов метода(), который обращается к члену «данные», должен вызывать ошибку времени выполнения. –
Это UB, ничего не гарантируется. Это может привести к ошибке выполнения, может работать хорошо (к сожалению). – songyuanyao