#include <iostream>
#include "Animal.h"
 
using namespace std;
 
 
class A
{
public:
    int num;
};
 
class B : public A
{};
 
operator+(const A& x, const A& y)
{
    A a;
    a.num = x.num + y.num;
    return a;
}
 
operator+(const B& x, const B& y)
{
    B b;
    b.num = x.num * y.num;
    return b;
}
 
void func(int x) // 컴파일 시 함수 이름이 변경 name mangling, 정적 결합
{}
 
void func(int x, int y) // 컴파일 시 함수 이름이 변경 name mangling, 정적 결합
{}
 
 
void foo(Animal* animal)
{
    animal->eat(); // 동적 결합, 오버라이딩, 실행 중일 때 animal의 실제 타입을 알 수 있고 그에 맞는 eat을 호출해준다
    animal->walk(); // 정적 결합, 컴파일 타임에 알 수 있는 'Animal' 만 보고 항상 뚜벅 
}
 
int main()
{
    // 정적 결합, static binding
    // 컴파일 시간에 결정
    // 예시) 오버로딩
 
    // 동적 결합, dynamic binding
    // 런타임에 결정
    // 예시) 오버라이딩
    
    B b0, b1;
    b0.num = 10;
    b1.num = 20;
 
    A& a0 = b0;
    A& a1 = b1;
 
    // 실제로는 a0, a1 둘 다 B class이지만 자료형이 A이기 때문에 A+A로 바인딩 된다. 오버로딩은 정적 결합
    // 실제 a0, a1이 가리키는 타입은 런타임에 알 수 있다.
    A a2 = a0 + a1; 
    cout << a2.num << endl// 30
 
    Animal* animal = new Dog;
    foo(animal);
 
 
    class A { int a; };
    class B { int a; virtual ~B() {} };
 
    cout << sizeof(A) << endl;
    cout << sizeof(B) << endl// virtual 함수가 한 개라도 있으면 사이즈가 늘어난다. 가상함수 테이블을 가리키는 포인터 추가
    // 부모 자식 관계를 이용해 다형성을 이용하는 경우(Parent *p = new Child)
    // virtual 함수들은 가상 함수 테이블에 등록되고 실행 시 포인터 타입을 보고 함수를 실행하지 않고
    // 가상 함수 테이블에 있는 함수를 실행한다.
}
cs

'::public > C++' 카테고리의 다른 글

private, protected 상속  (0) 2020.11.27
추상 클래스, 순수 가상 함수  (0) 2020.11.27
가상 함수  (0) 2020.11.27
상속의 기본  (0) 2020.11.27
사용자 정의 리터럴  (0) 2020.11.23

+ Recent posts