-
메서드 오버라이딩의 특수한 경우@ 16. 1 ~ 17. 1/면접관련 2017. 1. 4. 20:06
부모클래스의 메서드가 static인 경우 오버라이딩을 할 수가 없다.
자식클래스에서 부모클래스에 있는 static메서드와 같은 이름의 메서드를 정의하면 두개의 별개인 메서드가 만들어진다.
그리고 메서드가 호출되는 객체의 종류에는 영향을 받지 않는다. 즉,
문법상 객체를 통해 호출될때 (부모의 포인터) 실제 객체의 타입과는 관계없이 그 객체를 참조하는 있는 타입만이 호출할 메서드를 결정한다는데..
(그냥 부모것으로 호출된다고..)
class A { public: static void beStatic() { cout << " A static " << endl; } }; class B : public A { public: static void beStatic() { cout << "B static " << endl; } }; int main() { A a; B b; a.beStatic(); b.beStatic(); A &c=b; c.beStatic(); A *d=&b; d->beStatic(); getch(); return 0; }
부모클래스의 메서드가 디폴트 인자 값을 가진 경우
부모클래스와 자식클래스는 각자 서로 다른 디폴트 인자 값을 가질 수 있다.
어느 디폴트 인자가 이용될지는 어느 클래스 타입을 이용했느냐에 의해 결정된다.
이유는 C++에서 디폴트 인자 값을 결정할 때 실제 이용된 객체는 보지않고 코드에서 표현된 타입만 보기때문이다.(반대라는것)
이 때문에 디폴트 인자 값을 C++에서 상속되지 않는다.
그래서 디폴트 인자값이 있는 메서드를 오버라이딩할 때는 항상 같은 값으로 디폴트 인자를 정의해 주는 것이 바람직하다.
'@ 16. 1 ~ 17. 1 > 면접관련' 카테고리의 다른 글
생성자 및 대입연산자 관련 자식에서 부모를 호출해야한다. (0) 2017.01.04 클래스 생성 순서(부모, 자식) (0) 2017.01.04 friend 키워드의 의미? (0) 2017.01.04 참조와 포인터 차이점, 지역변수 참조반환하지말것! (0) 2017.01.04 void 형 포인터 (0) 2017.01.04