我有一個簡單的程序是這樣的:爲什麼輸出與我所期望的不同?
#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