现在的位置: 首页 > 综合 > 正文

都是virtual惹的祸

2013年08月29日 ⁄ 综合 ⁄ 共 2608字 ⁄ 字号 评论关闭

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

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

 

#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了~~~

抱歉!评论已关闭.