-
기본클래스 *ptr1;
기본클래스 *ptr2 = new 첫번째 상속클래스
기본클래스 *ptr3 = new 두번째 상속클래스
여기서 ptr1, ptr2, ptr3는 모두 기본 클래스에 대한 포인터로 선언되어 있기 때문에
각각의 정적 타입도 모두 이 타입이다
정적 타입이란 프로그램소스 안에 선언문을 통해 그 객체가 갖는 타입을 말한다.
정적타입이 기본클래스 일뿐..
동적타입은
ptr2의 동적 타입은 첫번째 상속클래스
ptr3는 두번째 상속클래스
ptr1은 없기 때문에 없다.
동적 타입은 프로그램이 실행되는 도중에 바뀔 수 있다. 대게 대입떄..
ptr1=ptr2 // ptr1의 동적 타입은 이제 첫번째 클래스가 된다.
가상함수는 동적으로 바인딩된다. 호출이 일어난 객체의 동적 타입에 따라 어떤 가상함수가 호출될지를 결정한다.
근데 기본 매개변수 값이 설정된 가상함수에서 가상함수는 동적으로 바인딩되지만 기본 매개변수는 정적으로 바인딩되어 있기 때문이다..
class A
{
public:
int num;
public:
A() : num(0)
{
}
virtual int intnum(int a=1)
{
num=a;
return num;
}
virtual void show()
{
cout << "A" << endl;
}
};class B : public A
{
public:
virtual int intnum(int a=2)
{
num=a;
return num;
}
virtual void show()
{
cout << "B" << endl;
}
};
int main()
{
A* ptr=new B;
cout << ptr->intnum() << endl;
ptr->show();
B* ptr1=new B;
cout << ptr1->intnum() << endl;
ptr1->show();
getch();
return 0;
}결과
1
B
2
B
* 상속받은 기본 매개변수 값은 절대로 재정의해서는 안됩니다.
왜냐하면 기본 매개변수 값은 정적으로 바인딩되는 반면 가상함수(우리가 오버라이드할 수 있는 유일한 함수이다. 상속에선..) 동적으로 바인딩되기 때문이다.
'@ 16. 1 ~ 17. 1 > Effective C++' 카테고리의 다른 글
항목 7:가상 소멸자 (0) 2015.01.14 항목6 : 복사생성자 및 대입연산자 제한 (0) 2015.01.14 항목 33 : 상속된 이름을 숨기는 일은 피하자 (0) 2014.06.01 항목4 : 객체를 사용하기 전에 반드시 그 객체를 초기화하자 (0) 2013.08.25 항목 20 : 값에 의한 전달 보다는 상수객체 참조자에 의한 전달방식을 택하는 편이 낫다 (0) 2013.08.19