这次写了调试记录看的比较清楚的代码,如下

 1 #include <iostream>
 2 using namespace std;
 3 
 4 class A
 5 {
 6 public:
 7        int *iaptr;
 8  
 9        A ()     
10        {
11                iaptr = new int[1];
12              *iaptr = 15;        
13       } 
14      virtual ~A ()
15      {
16          if(iaptr == NULL) cout << "ia is null" << endl;
17          else cout << "~A " << *iaptr << endl;
18          delete iaptr;
19           // cout << "~A" << endl;
20            iaptr = NULL;
21      } 
22      virtual void f()
23      {
24           cout << "A:f()" <<endl;
25      }
26      int getia()
27      {
28            if( iaptr)
29            cout <<  *iaptr << endl;
30          else
31          {
32                cout << "ia ptr is null" << endl;      
33          }    
34      } 
35 };
36 
37 class B : public A
38 {
39        public :
40        int *ibptr;
41 
42       B()
43       {
44         ibptr = new int[1];
45         *ibptr = 31;      
46       }
47       virtual ~B()
48       {
49               if(ibptr == NULL) cout << "ib is null" << endl;
50               else cout << "~B " << *ibptr << endl;
51                  delete ibptr;
52                 // cout << "~B" << endl; 
53               ibptr = NULL;          
54       }  
55       virtual void f()
56       {
57                  cout << "B:f()" << endl;           
58       }
59       int getib()
60      {
61            if( ibptr)
62            cout <<  *ibptr << endl;
63          else
64          {
65                cout << "ib ptr is null" << endl;      
66          }    
67      } 
68 };
69 
70 typedef void (*F)();
71 
72 int main()
73 {
74 
75      F pf = NULL;
76     B *b = new B();
77     int **p = (int **)b;
78 
79     int flag =  0 ;
80     pf = (F)p[0][flag];
81     pf();
82 
83 
84     cout << "END"<<p[0][3] << endl;
85     b->getia();
86     b->getib();
87 
88 
89     cout << sizeof(A) << endl;
90     cout << sizeof(B) << endl;
91     printf("---\n");
92     delete b;
93     printf("---\n");    
94     b = NULL;
95     delete b;
96     printf("---\n");
97 }

 

输出如下

flag=0

~B 31
~A 15
END0
ia ptr is null
ib ptr is null
8
12
---
ia is null
---
---

flag=1

~B 31
~A 15
END0
ia ptr is null
ib ptr is null
8
12
---
ia is null
---
---
[段错误]

flag=2

B:f()
END0
15
31
8
12
---
~B 31
~A 15
---
---

分析:

从flag=0的输出,不用多分析,第一个虚析构函数执行后,delete b这句真的只执行A的析构函数。其它的与之前猜测相符。看来准备看权威书籍如何解释了。

posted on 2014-10-23 15:57  Notflybird  阅读(191)  评论(0)    收藏  举报