我有一个简单的程序是这样的:为什么输出与我所期望的不同?
#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()后,如何调用method()方法?
- 为什么类B的method()被调用两次?
这只是UB,试图解释行为是没有意义的。 – songyuanyao
我不这么认为。您看到对method()的调用获得成功并打印出正确的数据值。如果这些对象实际上被销毁,那么调用访问“data”成员的method()应该会引发一个运行时错误。 –
这是UB,没有保证。它可能会引起运行时错误,可能会运行良好(不幸的是)。 – songyuanyao