[C++] 객체 포인터의 참조관계

dd_ddong·2022년 7월 30일
0

c++

목록 보기
26/38

객체 포인터 변수

기초클래스의 포인터는 유도클래스 객체도 가리킬 수 있다.

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개 존재하게 된다.

0개의 댓글