기초클래스의 포인터는 유도클래스 객체도 가리킬 수 있다.
class SoBase {
private:
int baseNum;
public:
SoBase(int n) :baseNum(n)
{
}
};
class SoDerived : public SoBase
{
private:
int derivNum;
public:
SoDerived(int n) : SoBase(n), derivNum(n)
{
}
void Method1()
{
cout << "Method1" ;
}
};
int main()
{
SoBase* ptr1 = new SoDerived(5);
//ptr1->Method1(); 접근불가
}
SoDerived객체이지만 SoBase 포인터로 가리키고 있기 때문에 SoDerived 멤버에 접근 불가하다.
c++컴파일러는 포인터연산의 가능성 여부를, 포인터의 자료형을 기준으로 판단하지,
실제 가리키는 객체의 자료형을 기준으로 판단하지 않는다.
유도클래스의 멤버이기 때문에
실제 객체는 Derived객체이지만 Base포인터로 가리키고 있으므로 Derived포인터에 대입할 수 없다.
Derive 객체는 Base객체를 포함하고 있기 때문에 Base포인터에 대입 가능하다.
유도클래스에서 기초클래스에 있는 함수와 똑같은 함수를 선언한 것을 함수 오버라이딩이라 한다.
class SoBase {
private:
int baseNum;
public:
SoBase(int n) :baseNum(n)
{ }
virtual void TestOverride()
{
cout << "SoBase Test";
}
};
class SoDerived : public SoBase
{
private:
int derivNum;
public:
SoDerived(int n) : SoBase(n), derivNum(n)
{ }
void TestOverride()
{
cout << "SoDerived Test";
}
};
위의 경우 TestOverride함수를 오버라이딩 했다. 오버라이딩을 하면 결과적으로 TestOverride 함수가 2개 존재하게 된다.