본문으로 바로가기
- 가상 함수

- 동적 바인딩을 수행
- virtual 키워드를 붙여 정의된 함수

virtual을 붙힌 상태에서 자식 클래스에 같은 함수가 있다면 자식클래스에 있는 함수를 호출한다.
부모클래스 포인터를 만든 상태로 함수를 호출하면 원래 부모클래스에 있는 함수가 호출 되어야하는데 
virtual을 붙여서 사용하기 때문에 각각의 자식클래스의 함수가 호출된다.


#include <iostream>
using namespace std;
class Parents
{ public:
virtual void Func(){ cout<<"부모 함수"<<endl;}
};

class Child : public Parents
{ public: void Func(){ cout<<"자식1 함수"<<endl;}
};
class Child2 : public Parents
{ public: void Func(){ cout<< "자식2 함수"<<endl;}
};
void main()
{
Parents * pt1 = new Parents;pt1->Func();
Parents * pt2 = new Child; pt2->Func();
Parents * pt3 = new Child2; pt3->Func();
}


- 순수 가상 함수

- 함수의 정의 없이 선언만 되어있는 가상 함수로 오버라이딩의 목적으로 정의해서 선언 뒤에 =0을 붙여서 순수 가상함수를 만든다.


- 추상 Class
- 하나 이상의 멤버 함수가 순수 가상 함수인 Class로 추상 Class는 객체화 할수 없다. (함수의 정의가 생략되어서 완전한 클래스가 아니다)

 //-. 동물원 : Speak( ) , Walk( ) 기능 작성
//-> IS ? A  상속관계로 코드를 간결하게 작성
#include <iostream>
using namespace std;
class Animal
{
public:
virtual void Walk()
{ cout << "네발로 걷는다" << endl; }
virtual void Speak()=0;
};
class Tiger : public Animal
{
public:
void Speak()
{ cout << "어흥~" << endl; }
};
class Dog : public Animal
{
public:
void Speak()
{ cout << "멍멍~" << endl; }
};
class Cat : public Animal
{
public:
void Speak()
{ cout << "야옹~" << endl; }
};
class Cow : public Animal
{
public:
void Speak()
{ cout << "음메~" << endl; }
};
class Duck : public Animal
{
public:
void Speak()
{ cout << "꽥꽥~" << endl; }
void Walk()
{ cout << "두발로 걷는다" << endl; }
};
class MGR_Animal
{
Animal * ani;
int select;
public:
void Start()
{
while(1)
{
cout << "1.호랑이" << endl;
cout << "2.강아지" << endl;
cout << "3.고양이" << endl;
cout << "4.소" << endl;
cout << "5.오리" << endl;
cout << "선택: " << endl;
cin >> select;
switch(select)
{
case 1:
ani = new Tiger;
break;
case 2:
ani = new Dog;
break;
case 3:
ani = new Cat;
break;
case 4:
ani = new Cow;
break;
case 5:
ani = new Duck;
}
ani->Speak();
ani->Walk();
}
}
~MGR_Animal()
{
delete ani;
}
};
void main()
{
MGR_Animal mg;
mg.Start();

is 상속, has 상속, 포인터, 가상함수, 오버라이딩 다 들어 있다.


- 상속과 생성자

자식클래스 객체 생성시 부모 클래스의 생성자가 먼저 실행된후 자식 클래스의 생성자가 실행됨


- 콜론초기화

- 객체를 만들면서 멤버 변수를 초기화
- Class의 생성자에 작성
- 배열은 초기화 불가능
Class의 멤버 변수 중 Const(변수를 상수처럼 사용)가 있으면 반드시 콜론 초기화 해야함


- Template

- 무엇인가를 만들기 위한 형틀
- 틀은 고정되어 있지만 그 안에 들어가는 데이터의 형태에 따라 다른 결과물을 낼 수 있음
- 컴파일러가 호출하는 시점에 필요한 타입을 자동으로 찾아 코드를 생성


- 함수 Template 

- 함수를 만들기 위한 형틀
- 코드는 동이하고 데이터 타입만 다른 함수를 정의하는 경우 사용
- 함수가 호출되는 순간 함수로 전달되는 인자의 타입을 보고 인자로 전달되는 타입으로 변경된 함수를 생성

template< typename or class 이름>


#include <iostream>
using namespace std;

template <typename T>
T Func(T num1, T num2)
{
return num1+num2;
}
void main()
{
cout <<Func<int>(10,20)<<endl;
cout<<Func<double>(1.3,3.5)<<endl;
}

typeid 연산자 
- 변환된 타입에 대한 자료형을 확인


#include <iostream>
using namespace std;

template <typename T1, class T2, class T3>
T1 Func(T2 num1, T3 num2)
{
cout<< "반환 : " <<typeid(T1).name()<< endl;
cout<< "num1 : " << typeid(T2).name()<< endl;
cout<< "num2 : " << typeid(num2).name()<<endl;
return num1+num2;
}
void main()
{
cout<<Func<int>(10,20)<<endl;
cout<<Func<double>(1.3,3.5)<<endl;
cout<<Func<double>(1.3,5)<<endl;
cout<<Func<double>(5,5)<<endl;
}

함수 Template 특수화
- Template 함수 사용 시 특정 타입에 대해서만 다른 함수를 동작하도록 하고 싶을 때 사용
- 작성 방법
template<> 반환자료형 함수명 

Class Template
- Class 내 멤버의 타입만 다를 경우 사용
클래스 위에 template <typename T> 만약에 클래스 선언만 하고 밑에서 정의해주는경우 template도 같이 위/아래에 적어주어야 한다.

Friend 란
- 특정 함수나 Class를 Friend로 만들어 정보은닉한 영역에 접근
C++의 특징인 정보은닉을 파괴하므로 많이쓰면 좋지 않다.

Friend 함수란 ? 
- 함수를 특정 Class의 Friend로 선언하면 해당 Class의 private멤버에 접근이 가능
friend 반환자료형 함수명(매개변수);

Friend Class란 ?
- class를 특정 Class의 Friend로 선언하면 해당 Class의 private멤버에 접근이 가능
friend class class명;


#include <iostream>
#include <string>
using namespace std;
class Member
{
int num;
public:
friend void Func(Member * mb, int num);
};

void Func(Member * mb, int num)
{
mb->num=num;
cout << mb->num<< endl;
}

void main()
{
Member mb;
Func(&mb,10);
}

#include <iostream>
#include <string>
using namespace std;
class Member
{
int num;
public:
friend void Func(Member * mb, int num);
};

void Func(Member * mb, int num)
{
mb->num=num;
cout << mb->num<< endl;
}

void main()
{
Member mb;
Func(&mb,10);

예외처리란?
프로그램 실행중 에러 방생하면 프로그램이 멈추는 것을 방지하기 위해 에러에 대한 처리방식을 결정해줌

예외처리 키워드
-try : 예외 발생에 대한 검사범위를 설정
-catch : 예외를 처리하는 코드 블록을 선언
-throw : 예외 발생시 지정된 값을 전달
#include <iostream>
#include <string>
using namespace std;

void main()
{
int num1, num2;
cin >> num1>>num2;
try
{
if(num2==0)
throw num2;
cout<<num1/num2<<endl;
}catch(int a)
{
cout<<a<<"으로 나눌 수 없음"<<endl;
}
} // throw가 던진걸 catch가 받아준다 


'[ IT ] > C++, 자료구조' 카테고리의 다른 글

자료구조 수업 1  (0) 2015.06.24
C++ namespace / using / bool  (0) 2015.06.24
C++ String / 상속 / 바인딩  (0) 2015.06.24
C++ Gotoxy 함수  (0) 2015.06.24
C++ 파일 분할  (1) 2015.06.24