1. 연산자 오버로딩


Overloading :  함수의 이름은 하나이지만 기능은 여러가지


1) 연산자 오버로딩 코드

-다음 그림과 같이 두 가지 형태로 표현할 수 있다


2)연산자 Overloading의 방법 

1)Member Function에 의한 방법

2)Global Function에 의한 방법



*만약 동일한 자료형을 대상으로 +연산자를 Global Function기반으로,그리고 Member Function기반으로 동시에 Overloading 할 경우, 

Member Function으로 Overloading된 함수가 우선시됨


3) 연산자 Overloading이 불가능한 연산자 종류


4) 연산자 오버로딩 하는데 있어서 주의사항


*연산자의 기본 기능을 변경하는 형태의 연산자 Overloading은 허용안됨








1. 다중상속 


다중상속 : 둘 이상의 Class를 동시에 상속하는 것


2. 다중상속의 모호성

-다음 코드와 같이 상속한 Class들에 같은 이름을 가진 Function이 존재할 경우 호출의 대상을 구분해서 명시해야함


3. 가상 상속(Virtual Inheritance)


-다중상속을 하게되면 위의 구조와 같이 Base Class를 2번 간접 상속을 하게 된다.


-다중상속을 한 Class멤버는 2번 간접 상속을 하여 Base Class의 같은 멤버함수가 2개 존재하는 상태


-이를 해결하기 위해서 Virtual Inheritance(가상 상속)을 하게 되면 Base의 멤버함수가 1개만 상속되게 됨

-또한, Base Class의 생성자가 한번만 호출됨(Derived Class의 객체 생성시)



1. Member Variable은 Object내에 존재하지만, Member Function은 Memory의 한 공간에 별도로 위치하고선, 이 Function이 정의된 Class의 모든 Object가 이를 공유하는 형태를 취함



-다음 그림과 같이 두개의 구조체 variable(객체)가 Function을 공유하고 있음


2. 가상함수의 동작원리와 가상함수 테이블(V-Table, Virtual Table)


-한 개 이상의 Virtual Function을 포함하는 Class에 대해서는 Compiler가 Virtual Table을 만듬


-Overriding된 Virtual Function의 주소정보는 Derived Class의 Virtual Table에 포함되지 않음


그림은 AAA를 BBB가 상속하는 상황


-main함수가 호출되기 이전에 다음의 구조로 Virtual Table이 메모리 공간에 할당됨( Virtual Table은 객체의 생성과 상관없이 메모리 공간에 할당됨)


-Virtual Function을 하나이상 Member로 지니는 Class의 Object에는 Virtual Table의 주소 값이 저장됨

-BBB Class의 Virtual Table을 살펴보면, Overriding된 AAA  Class의 Func1 함수에 대한 정보가 없음을 알 수있음, BBB Class의 Func1함수가 대신 호출되는데, 이것이 Virtual Function의 호출원리


'Programming Language > C++' 카테고리의 다른 글

10-1 연산자오버로딩  (0) 2019.01.31
09-2 다중상속  (0) 2019.01.31
08-3 가상 소멸자와 참조자의 참조 가능성  (0) 2019.01.29
08-2 가상함수  (0) 2019.01.29
08-1 객체 포인터의 참조관계  (0) 2019.01.15

1. 가상 소멸자 ( Virtual Destructor )


-위와 같이 Second Class를 생성하게 되면 First Class와 Second Class의 Constructor가 나란히 호출되고 나중에 소멸될 때 First Class(Base Class)의 할당을   해제하면 Second Class의 Destructor가 호출되지 않는 문제가 발생함

-이를 위해 First Class(Base Class)의 Destructor에 Virtual선언을 해주어, 이를 상속하는 Derived Class의 Destructor도 모두 Virtual Destructor로 선언이됨

 그리고 Virtual Destructor가 호출되면(Base Class의) 상속의 계층구조상 맨 아래에 존재하는 Derived Class의 Destructor가 대신 호출되고 그 다음 Base   Class의 Destructor가 순차적으로 호출됨


*상속관계에 있는 Class의 Constructor와 Destructor 호출 순서

First Class의 Constructor 호출 -> Second Class의 Constructor호출 -> Second Class의 Destructor호출 -> First Class의 Destructor호출


2. 참조자의 참조 가능성

* C++에서, AAA형 참조자는 AAA형 객체 또는 AAA를 직접 혹은 간접적으로 상속하는 모든 객체를 참조할 수 있음



'Programming Language > C++' 카테고리의 다른 글

09-2 다중상속  (0) 2019.01.31
09-1 멤버함수와 가상함수의 동작원리  (0) 2019.01.31
08-2 가상함수  (0) 2019.01.29
08-1 객체 포인터의 참조관계  (0) 2019.01.15
07-4 상속을 위한 조건  (0) 2018.01.22

1. C++ compiler는 포인터 연산의 가능성 여부를 판단할 때, 포인터의 자료형을 기준으로 판단하지, 실제 가리키는 객체의 자료형을 기준으로 판단하지 않는다.


- Derived class가 Base class를 상속하는 관계


2. 포인터 형에 해당하는 클래스에 정의된 멤버에만 접근이 가능함



*그림과 같이 클래스는 자신안에 있는 멤버만 볼 수 있기 때문에 위의 코드가 컴파일이 되지않음



3. 가상함수 ( Virtual Function)


-가상함수는 C++의 개념이 아닌 객체지향의 개념임



-함수가 가상함수로 선언되면, 포인터 변수가 실제로 가리키는 객체를 참조하여 가장 최근에 Overriding된 함수를 호출함

-Virtual Function이 선언되고 나면 이 함수를 Overriding하는 함수도 Virtual Function이 됨

-Overriding함수에 virtual선언을 추가하지 않아도 Virtual Function이 되지만 virtual선언을 넣어서 함수가 Virtual Function임을 알리는 것이 좋음


4. 상속을 하는 이유

-상속을 통해 연관된 일련의 클래스에 공통적인 규약을 정의할 수 있음 (이게 중요!)

-재활용


5. 순수 가상함수(Pure Virtual Function)와 추상 클래스(Abstract Class)

-Pure Virtual Function : 함수의 몸체가 정의되지 않은 함수

-명시적으로 몸체를 정의하지 않았음을 컴파일러에게 알림

-Abstract Class : 하나 이상의 멤버함수를 순수 가상함수로 선언한 클래스를 가리켜 추상 클래스라 함


*Class 중에서는 객체생성을 목적으로 정의되지 않는 Class도 존재함, 이런 Class의 객체생성을 컴파일러 단계에서 방지하기 위해

Virtual Function을 Pure Virtual Function으로 선언함



-Pure Virtual Function을 선언하는 방식 , main에 보면 First Class의 객체생성을 컴파일러가 금지하고 있음


6. 다형성(Polymorphism)

-C++에서 문장은 같은데 결과는 다른 경우


- 두 문장은 형식은 같지만 결과는 다르게 출력함



상속의 목적

1. 재활용(코드)

2. 확장성( 다른 클래스가 추가 되었을 때)

 

객체 포인터 변수 : 객체의 주소 값을 저장하는 포인터 변수

 

1. C++에서, AAA형 포인터 변수는 AAA객체 또는 AAA를 직접 혹은 간접적으로 상속하는 모든 객체를 가리킬 수 있다(객체의 주소값을 저장할 수 있다.)

 

 

2. 상속에서의 함수 Overriding

 

*주의할점

Base class와 동일한 이름의 함수를 Derived class에서 정의한다고 해서 무조건 Function Overriding이 되는 것은 아님. 

매개변수의 자료형 및 개수가 다르면, 이는 Function Overloading이 되어, 전달되는 인자에 따라서 호출되는 함수가 결정됨

'Programming Language > C++' 카테고리의 다른 글

09-1 멤버함수와 가상함수의 동작원리  (0) 2019.01.31
08-3 가상 소멸자와 참조자의 참조 가능성  (0) 2019.01.29
08-2 가상함수  (0) 2019.01.29
07-4 상속을 위한 조건  (0) 2018.01.22
static  (0) 2018.01.10

상속을 위한 조건


*상속 관계를 가질 수 있느 관계는 2가지가 있다


1.IS-A관계


*A is a B

-A는 B의 범주안에 들어감


ex)예시

전화기->무선전화기

전화기(Base Class)

무선전화기(Derived Class)


컴퓨터->노트북 컴퓨터

컴퓨터(Base Class)

노트북 컴퓨터(Derived Class)


*Base Class일수록 더 근본적인 것, Derived Class일수록 더 구체적인 것


2.HAS-A 관계


ex)예시

경찰 has a 총

총(Base Class)

경찰(Derived Class)


총에 관련된 멤버 변수를 경찰Class가 상속 받는다


*이렇게 되면 두 class간의 커플링(의존도)가 높아진다


--------------------------------------------------------------------


결론:has-A관계는 상속으로 표현하지 말자(대신 Police에 멤버 변수로 Gun객체를 포함시킴)


=====================================








'Programming Language > C++' 카테고리의 다른 글

09-1 멤버함수와 가상함수의 동작원리  (0) 2019.01.31
08-3 가상 소멸자와 참조자의 참조 가능성  (0) 2019.01.29
08-2 가상함수  (0) 2019.01.29
08-1 객체 포인터의 참조관계  (0) 2019.01.15
static  (0) 2018.01.10


c++에서는 멤버 변수나 멤버 함수에 static을 붙일 수 있다


<정의>

클래스안에 정의된 static변수를 클래스 변수라고 한다


<표현>


class A{


static int num=3;


}




<사용법>


Class안에 static 변수를 정의하면 외부에서 사용할 수 있는 방법이 세 가지 있다


1 .num;


2. A::num;


3. 객체를 인스턴스화 했을 때

A obj;

obj.num;


*근데 이 방법은 거의 사용하지 않는다, obj.num문장만 보았을 때 num이 멤버변수인지 클래스변수인지

확실히 모르기 때문!



==================




<유의점>

1.전역변수에 선언된 static의 의미

-선언된 파일 내에서만 참조를 허용하겠다는 의미


2.함수 내에 선언된 static의 의미

-한번만 초기화되고, 지역변수와 달리 함수를 빠져나가도 소멸되지 않음


3.static변수를 생성자 안에 넣을 수 있지만 객체가 생성될 때마다 초기화되기 때문에

제대로 초기화하려면 static변수가 선언된 class의 밖에서 초기화해야한다

ex)


class A{



}

 


+ Recent posts