#include <iostream>
using namespace std;
/*
class Base
{
int a;
public: inline virtual void foo(){}
virtual void goo(){}
virtual void hoo(){}
};
class Derived : public Base{
int b;
public :
virtual void foo(){}
};
int main(){
Base b; cout << sizeof(b)<<endl;
Derived d; cout << sizeof(d)<<endl;
//////////////////////////////////////////////////////////
/// 가상함수 테이블로 인해 4바이트가 늘어난다.
///////////////////////////////////////////////////////////
Base *p = &d;
p->foo(); //*p 가 가르키는 곳을 따라가면 .. goo가 있을 것이다.. 그중에 첫번째 를 호출해 달라.. *p[1]()
//가상 함수의 장점 : 실행 시간 다형성을 얻을 수 있다.
// 단점 : (1) 가상함수 테이블 때문에 메모리 부담. MFC가 이 부담을 없애기 위해 메세지 맵 도입
// (2) 실제 객체의 크기보다 4바이트 더 필요하다. - 약간의 메모리 부담
// (3) 함수 호출시 간접 호출에 따른 속도의 부담
// (4) 인라인 치환이 불가능해서 성능의 부담..
//
//
}*/
////////////////////////////////////////////////////////////////////////////////
#include<iostream>
using namespace std;
/////////////////////////////////////////////////////////
// 가상함수 이야기 2
// 가상함수는 실행시간에 어느 함수인지가 결정된다.
// 디폴트 인자는 : 컴파일러가 한다.
// 가상함수에서는 되도록이면 디폴트 인자를 사용하지 말자!.
//
//////////////////////////////////////////////////////////
/*
class A{
int x;
public :
virtual void foo(){ cout << "1" << endl;}
};
class B{
int y;
public:
virtual void goo(){ cout<< "2"<<endl;}
};
int main(){
A a;
B* p = reinterpret_cast<B*>(&a);
p->goo();
//////////////////////////////////////////////////////////////
//A와 B에 virtual 을 넣었을때와 뺏을떄의 결과값이 다르다.. 왜?!
// 가상함수는 포인터의 개념이기 떄문에,
// 가상함수가 없을떄는 static binding 을 통해 메모리가 정해지지만
// 가상함수를 넣어줌으로써 dynamic binding 을 통해 상대적으로 가르치고 있는곳을 가르킨다.
////////////////////////////////////////////////////////////////////
}*/
/*
class A{
public :
virtual void foo(int a=10){cout << "1: "<< a<<endl;}
};
class B : public A{ // 이번엔 상속을 봐보자.
public :
virtual void foo(int a=20){cout << "2: "<< a<< endl;}
};
int main(){
A *p = new B;
p->foo(); //실행하지 말고 결과 예측?!
//2 : 10 이나온다..ㅠㅠ
//컴파일시에는 a가 초기화 되고 , 실행시는 함수포인터가 결정된다
//즉 결과는 *p[1](10) 이 나온다.
}
*/
//////////////////////////////////////////////////////////////////////////////////////////////////
'C,C++ > Android_FrameWork' 카테고리의 다른 글
[SSM 안드로이드 프레임워크 개발 강의]25. RTTI 이야기 (0) | 2012.08.16 |
---|---|
[SSM 안드로이드 프레임워크 개발 강의]24. 가상 소멸자 이야기 (0) | 2012.08.16 |
[SSM 안드로이드 프레임워크 개발 강의]22. 범용적 함수 포인터와 bind (0) | 2012.08.15 |
[SSM 안드로이드 프레임워크 개발 강의]21. 인터페이스와 인터페이스 탄생 배경 (0) | 2012.08.15 |
[SSM 안드로이드 프레임워크 개발 강의]20. 접근변경자와 어뎁터 패턴 (0) | 2012.08.15 |