객체포인터의 참조관계

sz L·2023년 3월 29일
0

C++

목록 보기
26/40
post-thumbnail

객체 포인터 변수

  • 객체의 주소 값을 저장하는 포인터 변수
Person * ptr;			 // 포인터 변수 선언
ptr = new Person(); 	 // 포인터 변수의 객체 참조
  • 위의 문장이 실행되면, 포인터 ptr은 Person 객체를 가리킴
  • Person형 포인터는 Person 객체뿐만 아니라, Person을 상속하는 유도클래스의 객체도 가리킬 수 있다
    • class Student : public Person
      {
          ...
      }
      Person * ptr = new Student(); // 이 문장도 가능하다.
      // Student는 Person을 상속하므로, Person형 포인터 변수는 Student 객체를 가리킬 수 있음

유도클래스의 객체 가리키기

#include <iostream>
using namespace std;

class Person
{
public:
	void Sleep() { cout << "Sleep" << endl; }
};

class Student :public Person
{
public: 
	void Study() { cout << "Study" << endl; }
};

class PartTimeStudent :public Student
{
public:
	void Work() { cout << "Work" << endl; }
};

int main()
{
	Person* ptr1 = new Student(); // Person type의 객체 포인터			// super -> sub
	Person* ptr2 = new PartTimeStudent();								// super -> sub
	Student* ptr3 = new PartTimeStudent(); //Student type의 객체 포인터 // super -> sub
	PartTimeStudent* ptr4 = new PartTimeStudent();						// super -> sub

	//PartTimeStudent* ptr5 = new Student();								// sub -> super 불가능!!

	printf("Person 타입의 객체 포인터\n-----------------------------------\n");
	ptr1->Sleep();
	//ptr1->Study(); type이 달라서 에러발생
	ptr2->Sleep();
	
	printf("\n\nStudent 타입의 객체 포인터\n-----------------------------------\n");
	ptr3->Study();
	ptr3->Sleep();

	printf("\n\nPartTimeStudent 타입의 객체 포인터\n-----------------------------------\n");
	ptr4->Sleep();
	ptr4->Study();
	ptr4->Work();

	delete ptr1;delete ptr2;delete ptr3;

	return 0;
}

  • Person* ptr1 = new Student();
    • Student는 Person을 상속하므로, Person형 포인터 변수는 Student 객체를 가리킬 수 있다
  • Person* ptr2 = new PartTimeStudent();
    • PartTimeStudent는 Person을 간접 상속하므로, Person형 포인터 변수는 PartTimeStudent 객체를 가리킬 수 있다
  • Student* ptr3 = new PartTimeStudent();
    • PartTimeStudent는 Student를 상속하므로, Student형 포인터 변수는 PartTimeStudent 객체를 가리킬 수 있다

참고
포인터로 접근하려면 '->'사용
객체로 접근하려면 '.'사용

profile
가랑비는 맞는다 하지만 폭풍은 내 것이야

0개의 댓글