[pl in c++] 9. 다형성

24
PL in C++ 2014.8.4 박박박 8. 박박박

Upload: mingeun-park

Post on 21-Aug-2015

318 views

Category:

Documents


0 download

TRANSCRIPT

PL in C++

2014.8.4박민근

8. 다형성

수업전 질문

http://agebreak.clbnow.com

QA

다형성

로보트상속 관계(is a 관계 )

구체화일반화

다형성

로보트

void Attack(Robot* pRobot);

Attack( 태권브이 );Attack( 건담 );Attack( 트랜스포머 );Attack( 아이기스 )

A is BA 는 B 역할을 할수 있다 .

B 자리에 A 가 들어가도 된다 .

다형성

void ExamMain::TestPolymorph1() {

CCharacter character;

CMob* pMob = new CMob(); CNPC* pNPC = new CNPC(); Elf* pElf = new Elf(); DarkElf* pDarkElf = new DarkElf();

character.Attack(pMob); character.Attack(pNPC); character.Attack(pElf); character.Attack(pDarkElf);

}

다형성

다형성std::vector<CCharacter> characters;Elf newElf;DarkElf newDarkElf;

characters.push_back(newElf);characters.push_back(newDarkElf);

// C++ 11 Range based forfor (auto charac : characters){    charac.SayMyName();}

여기까지 구현 !

문제점 ?std::vector<CCharacter> characters;Elf newElf;DarkElf newDarkElf;

characters.push_back(newElf);characters.push_back(newDarkElf);

// C++ 11 Range based forfor (auto charac : characters){    charac.SayMyName();}

객체의 불필요한 복사 (Copy) 가일어난다 !!

문제점 ?CCharacter::CCharacter(void){    m_Name = "Character";    

    printf_s("Character is Created!!\n");}

응 ?? 또 생성된다면서요 ??

복사 생성자class CCharacter{    public:    CCharacter(void); // 기본 생성자 CCharacter(const CCharacter& src); // 복사 생성자 virtual ~CCharacter(void);CCharacter::CCharacter( const CCharacter& src ){    m_Name = src.m_Name;    printf_s("%s is Copy!! \n", m_Name.c_str());}

복사 생성자

이건 또 뭐 ??

STL Vector – 주의할 점

STL Vector – Capacity

Capacity

벡터가 담을 수 있는 용량 . Capacity 를 넘어 간다면 ??

STL Vector – Capacity

1

2

3

4

Capacity : 4

5

Capacity : 8

새로운 공간을 할당한다

새로운 공간에 값을 복사한다

STL Vector – Capacity

1

2

3

4

Capacity : 4

5

1

2

3

4

Capacity : 8

새로운 공간을 할당한다

새로운 공간에 값을 복사한다

STL Vector – Capacity

1

2

3

4

Capacity : 4

1

2

3

4

Capacity : 8

새로운 공간을 할당한다

새로운 공간에 값을 복사한다

5

STL Vector – reserve

미리 공간을 할당한다

-> 재할당이 일어나지 않는다

STL Vector – resize

해결 std::vector<CCharacter*> characters;

Elf* pElf = new Elf();DarkElf* pDarkElf = new DarkElf();

characters.push_back(pElf);characters.push_back(pDarkElf);

// C++ 11 Range based for// 객체가 복사 (Copy) 된다 .for (auto charac : characters){    charac->SayMyName();}

??

해결 ??

Memory Leak!!

std::vector<CCharacter*> characters;

Elf* pElf = new Elf();DarkElf* pDarkElf = new DarkElf();

characters.push_back(pElf);characters.push_back(pDarkElf);

// C++ 11 Range based for// 객체가 복사 (Copy) 된다 .for (auto charac : characters){    charac->SayMyName();}

for (auto charac : characters){    delete charac;}characters.clear();

다형성 사용시 주의 사항

• 값의 복사 (Copy)

• 메모리 누수

수업후 질문

http://agebreak.clbnow.com