基类的虚析构函数

 1 #include <iostream>
 2 using namespace std;
 3 
 4 class Base
 5 {
 6 public:
 7        Base( void )
 8        {
 9              cout << "Base::Base( )" << endl;
10        }
11        
12        virtual void kkk()
13        {
14             cout << " kkk base." << endl;
15        }
16             
17        virtual ~Base( void ) //基类没有虚析构函数时
18        {
19               cout << "Base::~Base( )" << endl;
20        }
21 };
22 
23 class Derived : public Base
24 {
25 public:
26        Derived( void )
27        {
28                 m_pData = new int;
29                 cout << "Derived::Derived( )" << endl;
30        }
31        
32        virtual void kkk()
33        {
34             cout << " kkk Derived." << endl;
35        }
36        
37        virtual ~Derived( void )
38        {
39                 delete m_pData;
40                 m_pData = NULL;
41                 cout << "Derived::~Derived( )" << endl;
42        }
43        
44        int cc;
45 private:
46         int* m_pData;
47 };
48 
49 int main( void )
50 {
51     Base bo;
52     Derived* pD = new Derived;
53     
54     Base* pB = pD;
55      
56      //通过基类的指针去删除派生类的对象,而基类又没有虚析构函数时,结果将是不可确定的。
57     //(此处是派生类的析构函数没有被调用。)
58     
59     pB->kkk();                  //child
60     
61     Base &ba = *pD;
62     ba.kkk();                  //child
64     
65     Base bb = *pD;             //object truncate
66     bb.kkk();                  //base
67 
70     delete pB;                  //undefined
71     pB = NULL;
72     
73     system( "PAUSE" );
74     return EXIT_SUCCESS;
75 }

 

posted @ 2016-09-14 20:17  navas  阅读(338)  评论(0)    收藏  举报