都是virtual惹的祸

近期比较关注设计模式的学习,用到模式继承、多态的运用是必不可少的, 今天遇到的情况值得记录一下:

原程序如下:(简单的工厂模式)

 

#include  < iostream >
using   namespace  std;

//  kejie leung 
//  2008-4-13
// Factory Method Implement( in simple way )

class  Document
{
public:
    Document();
    
~Document();

public:
    
virtual void Open();
    
virtual void Close();

}
;

Document::Document()

    cout
<<"Document Construct "
}
;

Document::
~ Document()
{
    cout
<<"Document Disstruct "
}
;

void  Document::Open()
{
    cout
<<"Document Open a file ";
}


void  Document::Close()
{
    cout
<<"Document Close a file ";
}


class  MyDocument:  public  Document
{
public:
    MyDocument();
    
~MyDocument();

public:
    
void Open();

}
;

MyDocument::MyDocument()

    cout
<<"MyDocument Construct ";
}
;

MyDocument::
~ MyDocument()
{
    cout
<<"MyDocument Disstruct "
}
;

void  MyDocument::Open()
{
    cout
<<"MyDocument Open a file ";
}


class  Application
{
public:
    Application();
    
~Application(); 

public:
    
virtual Document * GetDocument() = 0;
    
virtual Document * CreateDocument() = 0;

}
;

// make the factory Create one product
Application::Application()
{
    cout
<<"Application Construct ";
}


Application::
~ Application()
{
    cout
<<"Application Disstruct ";
}


class  MyApplication:  public  Application
{
public:
    MyApplication();
    
~MyApplication();
public:
    Document 
* GetDocument();
    Document 
* CreateDocument();

private:
    MyDocument 
* doc;
}
;

MyApplication::MyApplication()
{
    cout
<<"MyApplication Construct ";
    doc 
= static_cast<MyDocument*>( CreateDocument() );
}


MyApplication::
~ MyApplication()
{
    
if( doc )
        delete doc;

    cout
<<"MyApplication Disstruct ";
}


Document 
*  MyApplication::GetDocument()
{
    
return doc;
}


Document 
*  MyApplication::CreateDocument()
{
    
return new MyDocument();
}



void  main()
{
    Application 
* theApp = new MyApplication();
    theApp
->GetDocument()->Open();

    delete theApp;
}



 

这时候问题来了,一运行结果如下:

Application Construct
MyApplication Construct
Document Construct
MyDocument Construct
MyDocument Open a file
Application Disstruct
Press any key to continue

-----------------

不知大家注意了没? MyDocument, Document, MyApplication都没有释放!!怎么回事呢?

再度一了下,觉得是指针问题:

Application  *  theApp  =   new  MyApplication();

theApp
-> GetDocument() -> Open();

既然是父类指向的子类,那个 delete theApp 时,调用的为什么不是MyApplication的释构而只是Application的释构呢?无耐之下来点硬的:

delete static_cast < MyApplication *> (theApp);

这时候结果总于正常了:

Application Construct
MyApplication Construct
Document Construct
MyDocument Construct
MyDocument Open a file
MyDocument Disstruct
Document Disstruct
MyApplication Disstruct
Application Disstruct
Press any key to 
continue

但这下就奇了,难道要这么个delete法?在这个百思不得其解之时,正好看到CSDN上有人提问,为什么释构要设定为virtual~~~~呵呵,一语惊醒梦中人~~~~终于知道个中玄机了:

释构就是要设定为virtual!!~~~~

这样就可以轻轻松松地delete了~~~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值