継承


継承関係で呼び出す

  • コード
  • #include "stdafx.h"
    #include <iostream>
    using namespace std;
    
    
    #include "stdafx.h"
    #include <iostream>
    using namespace std;
    
    // 부모
    class CMyData
    {
    public:		  
    	CMyData() { cout << "부모 생성자 호출 " << endl; }
    	~CMyData() { cout << "부모 소멸자 호출 " << endl; }
    	int GetData() { return m_nData; }
    	void SetData(int nParam) { m_nData = nParam; }
    
    protected:	  
    	void PrintData() { cout << "CMyData::PrintData()" << endl; }
    
    private:	  
    	int m_nData = 0;
    };
    
    // 자식
    class CMyDataEx : public CMyData
    {
    public:
    	CMyDataEx() { cout << "자식 생성자 호출 " << endl; }
    	~CMyDataEx() { cout << "자식 소멸자 호출 " << endl; }
    	void TestFunc()
    	{		
    		PrintData();
    		SetData(5);
    		cout << CMyData::GetData() << endl;
    	}
    };
    
    int _tmain(int argc, _TCHAR* argv[])
    {
    	CMyDataEx data;
    
    	data.SetData(10);
    	cout << data.GetData() << endl;
    	data.TestFunc();
    
    	return 0;
    }
  • data.SetData(10);
    子の作成者CMYData Exを呼び出すと、親の作成者が呼び出され、親の作成者が実行されると子の作成者が実行されます.
  • 消滅者は反対だ.子の除去->親の除去(Remove Child->Remove Parent)

    参照書式と線書式

  • コード
  • #include "stdafx.h"
    #include <iostream>
    using namespace std;
    
    //  부모
    class CMyData
    {
    public:
    	int GetData() { return m_nData; }
    
    	void SetData(int nParam) { m_nData = nParam; }
    
    	CMyData()
    	{
    		cout << "부모 생성자 호출" << endl;
    	}
    
    	~CMyData()
    	{
    		cout << "부모 소멸자 호출" << endl;
    	}
    
    private:
    	int m_nData = 0;
    };
    
    // 자식
    class CMyDataEx : public CMyData
    {
    public:	
    	void SetData(int nParam)
    	{		
    		if (nParam < 0)
    			CMyData::SetData(0);
    
    		if (nParam > 10)
    			CMyData::SetData(10);
    	}
    	CMyDataEx()
    	{
    		cout << "자식 생성자 호출" << endl;
    	}
    
    	~CMyDataEx()
    	{
    		cout << "자식 소멸자 호출" << endl;
    	}
    
    	void show_child()
    	{
    		cout << "child" << endl;
    	}
    };
    
    int _tmain(int argc, _TCHAR* argv[])
    {	
    	//추가
    	CMyData *tmp = new CMyDataEx(); // 상향 형변환	
    	delete tmp;
    
    	return 0;
    }

    わかること消滅者問題


    CMyData *tmp = new CMyDataEx();
    tmpはリファレンスフォーマットと呼ばれ、CMyDataExというやつは実フォーマットと呼ばれています.
    親を利用して子供を動的に分配することを、アップコンバートと呼ぶ.
    問題は,子の消滅者を呼び出さないことである.

    ->このコードには問題はありませんが、サブコードと親コードにジェネレータにポインタを割り当てるコードがある場合は、サブコードを割り当て解除できます.
    サブレベルの消滅者を呼び出さないため、メモリ漏洩が発生します.

    =>サブアイテムを呼び出せない消滅者をアップコンバートします。


    分かるポイント2アップコンバートではサブタイプは推定できません。



    ->訪問サブオブジェクトの関数を下に変換する必要があります。


    アップコンバート時に動作が滞る。対応策を講じるべきだ。