맞습니다. 단, 함수의 signature가 동일한 경우에만 그렇습니다. 다른 경우에는
숨긴다(hiding)고 하죠.
seohs80 wrote:
virtual 함수 : 기저클래스인 base클래스에서 virtual addon() 이렇게 되어있고
하위클래스인 extend 클래스에서도 addon이 정의되어있으면 'virtual 함수다' 라고 부르는거 맞죠?
기저클래스에서 가상으로 선언된 함수는 하위클래스에서 정의되지 않더라도 가상함수라고
부릅니다. 그리고 이것도 오버라이드의 한 형태입니다. 당연히 하위클래스에서 가상함수를
재정의하지 않을 수도 있습니다.
seohs80 wrote:
하부클래스에서 재정된 함수가 기저클래스의 객체에서 쓸 수가 있는건지 알려주시면 큰 도움이 되겠습니다.
쓸 수 없습니다. 기저클래스는 하부클래스가 존재하는지 알 수 없습니다. 따라서
기저클래스의 개체가 하부클래스의 멤버에 접근하는 것은 논리적으로 불가능합니다.
아마 기저클래스의 포인터나 참조로 하부클래스의 가상함수를 호출할 수 있다는 점
때문에 오해를 할 수 있는데, 그것은 포인터/참조하는 개체가 실은 하부클래스이기
때문에 가능한 것입니다. 코드로 설명하면
class Base
{
public:
virtual void f();
};
class Derived : public Base
{
public:
void f();
};
Base b;
b.f(); // calls Base::f(),
Base* p = new Derived;
p->f(); // calls Derived::f(), since *p is a Derived, not a Base
자식클래스의 인스턴스를 부모클래스 포인터나 레퍼런스로 가리킬 수 있습니다
자식클래스의 인스턴스를 부모클래스 포인터나 레퍼런스로 가리킬 수 있습니다. 이를 이용해서 어떤 함수를 호출할 때 가상함수가 아니라면 자식클래스에서 재정의를 했더라도 부모클래스의 함수가 호출되고, 가상함수라면 자식클래스에서 재정의한 함수가 호출됩니다.
Re: 오버라이딩과 가상함수의 차이점이 궁금합니다.
오버라이딩과 가상함수는 같은 범주에 속하는 개념이 아니므로 차이점을 말한다는
것이 좀 부적절합니다만...
맞습니다. 단, 함수의 signature가 동일한 경우에만 그렇습니다. 다른 경우에는
숨긴다(hiding)고 하죠.
기저클래스에서 가상으로 선언된 함수는 하위클래스에서 정의되지 않더라도 가상함수라고
부릅니다. 그리고 이것도 오버라이드의 한 형태입니다. 당연히 하위클래스에서 가상함수를
재정의하지 않을 수도 있습니다.
쓸 수 없습니다. 기저클래스는 하부클래스가 존재하는지 알 수 없습니다. 따라서
기저클래스의 개체가 하부클래스의 멤버에 접근하는 것은 논리적으로 불가능합니다.
아마 기저클래스의 포인터나 참조로 하부클래스의 가상함수를 호출할 수 있다는 점
때문에 오해를 할 수 있는데, 그것은 포인터/참조하는 개체가 실은 하부클래스이기
때문에 가능한 것입니다. 코드로 설명하면
댓글 달기