[pl in c++] 9. 다형성
TRANSCRIPT
로보트
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());}
해결 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();}
??
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)
• 메모리 누수