int* pInt = nullptr;
pInt
는 int로 접근한다는 것. Parent p1;
Child c1;
Parent* pP = &p1;
Child* pC = &c1;
float f = 0.f;
int* pInt = &f;
// (1) 부모 포인터 <= 자식객체 주소
Parent* pP = &c1;
// (2) 자식 포인터 <= 부모객체 주소
Child* pC = &p1;
pP->m_Parent = 10;
// 1
int iarr[10];
iarr[20] = 100;
// 2
int* pInt = new int[10];
pInt[20] = 100;
a->b->c->d->e
상태로 상속을 한 상태에 e
를 a,b,c,d,e포인터
들로 다 가리킬수 있다. Parent parent;
Child child;
parent.OutputMyData();
child.OutputMyData();
// Parent 클래스
void OutputMyData()
{
cout << "Parent" << endl;
cout << "m_Parent : " << m_Parent << endl;
}
// Child 클래스
void OutputMyData()
{
cout << "Child" << endl;
cout << "m_Parent : " << m_Parent << endl;
cout << "m_Child : " << m_Child << endl;
}
Parent* pP = nullptr;
parent.OutputMyData();
child.OutputMyData();
Parent* pP = &parent;
pP->OutputMyData();
// 1
pP = &child;
pP->OutputMyData();
pP
부모포인터가 child의 주소를 받아가도 부모쪽에 함수가 호출이 된다. Child* pC = &child;
pC->OutputMyData();
virtual void OutputMyData()
{
cout << "Parent" << endl;
cout << "m_Parent : " << m_Parent << endl;
}
virtual
키워드를 붙인다.virtual
키워드를 붙이면 일반 함수와 작동 방식이 달라진다.virtual
키워드가 단 하나라도 있다면 그 클래스에는 타입 정보(type info)가 생긴다. Parent p1;
Parent p2;
Parent p3;
Parent p4;
Child c1;
Child c2;
Child c3;
Child c4;
/*virtual*/ void VirtualFunc()
{
}
virtual
키워드를 가상 함수를 안붙인 부모쪽 함수를 자식쪽에 상속 시키고 오버라이딩 했다면?virtual
키워드를 붙이면 가상함수 테이블에 인덱싱되서 들어간다 class ChildChild
: public Child
{
};
Parent* pPP = &c1;
pPP->VirtualFunc();
ChildChild cc;
pPP = &cc;
pPP->VirtualFunc();
#include <iostream>
using std::cout;
using std::endl;
class Parent
{
public:
int m_Parent;
public:
void OutputMyData()
{
cout << "m_Parent : " << m_Parent << endl;
}
public:
Parent() : m_Parent(0) {}
Parent(int _P) : m_Parent(_P) {}
};
class Child
: public Parent
{
public:
int m_Child;
public:
void OutputMyData()
{
//cout << "m_Parent : " << m_Parent << endl;
Parent::OutputMyData();
cout << "m_Child : " << m_Child << endl;
}
public:
Child() :m_Child(0) {}
Child(int _P, int _C) : Parent(_P), m_Child(_C) {}
};
int main()
{
Parent p(10);
Child c(10, 20);
p.OutputMyData();
c.OutputMyData();
c.Parent::OutputMyData();
Parent p1;
Child c1;
Parent* pP = &c1; //(1) 부모 포인터 <= 자식객체 주소
//Child* pC = &p1; //(2) 자식 포인터 <= 부모객체 주소
//pP->m_Parent = 10;
//pC->m_Child = 10;
return 0;
}
#include <iostream>
using std::cout;
using std::endl;
class Parent
{
public:
int m_Parent;
public:
// 가상 함수
virtual void OutputMyData()
{
cout << "Parent" << endl;
cout << "m_Parent : " << m_Parent << endl;
}
virtual void VirtualFunc()
{
}
public:
Parent() : m_Parent(0) {}
Parent(int _P) : m_Parent(_P) {}
};
class Child
: public Parent
{
public:
int m_Child;
public:
void OutputMyData()
{
cout << "Child" << endl;
cout << "m_Parent : " << m_Parent << endl;
cout << "m_Child : " << m_Child << endl;
}
void VirtualFunc()
{
}
public:
Child() :m_Child(0) {}
Child(int _P, int _C) : Parent(_P), m_Child(_C) {}
};
class ChidlChild
: public Child
{
};
int main()
{
Parent parent;
Child child;
Parent* pP = &parent;
parent.OutputMyData();
pP->OutputMyData();
pP = &child;
child.OutputMyData();
pP->OutputMyData();
Child* pC = &child;
pC->OutputMyData();
Parent p1;
Parent p2;
Parent p3;
Parent p4;
Child c1;
Child c2;
Child c3;
Child c4;
Parent* pPP = &c1;
pPP->VirtualFunc();
ChidlChild cc;
pPP = &cc;
pPP->VirtualFunc();
return 0;
}
1차 24.01.15
2차 24.01.16
3차 24.01.17
4차 24.01.18
5차 24.01.19