객체지향 언어의 특징
#include <iostream>
using namespace std;
class Parent
{
public:
Parent()
: i_(0)
{}
~Parent()
{}
void setInt(int i)
{
i_ = i;
}
void print()
{
cout << "Parent" << endl;
}
protected:
int i_;
private:
};
class Child : public Parent
{
public:
Child()
: f_(0.f)
{}
~Child()
{}
void setFloat(float f)
{
f_ = f;
i_ = static_cast<int>(f);
}
void print()
{
cout << "Child" << endl;
}
private:
float f_;
};
int main()
{
Child child;
child.setFloat(10.0f);
child.setInt(3);
// 오버라이딩
child.print();
child.Parent::print();
return 0;
}
오버로딩 : 함수의 이름은 같지만 인자가 달라서 컴파일러에서 구분 가능.
오버라이딩 : 부모, 자식 양쪽에 같은 이름의 함수가 구현되어 있으면 자식 클래스의 함수가(오버라이딩 되어) 호출된다.
#include <iostream>
using namespace std;
class Parent
{
public:
Parent()
: i_(0)
{}
virtual ~Parent()
{}
void setInt(int i)
{
i_ = i;
}
virtual void print()
{
cout << "Parent" << endl;
}
protected:
int i_;
private:
};
class Child : public Parent
{
public:
Child()
: f_(0.f)
{}
void setFloat(float f)
{
f_ = f;
i_ = static_cast<int>(f);
}
void print()
{
cout << "Child" << endl;
}
void newFunc()
{
}
private:
float f_;
};
int main()
{
Parent parent;
Child child;
//Parent* parent_ptr = &parent; // 가능
//Child* child_ptr = &child; // 가능
// Parent* parent_ptr = &child; // 가능
// Child* child_ptr = &parent; // 불가능
Parent* parent_ptr = &parent;
Parent* child_ptr = &child;
parent_ptr->print(); // parent가 출력됨
child_ptr->print(); // parent가 출력됨. 가상함수 virtual을 사용해야함.
// 다운캐스팅
Child* down_casting = dynamic_cast<Child*>(child_ptr);
if (nullptr != down_casting)
{
down_casting->newFunc();
}
return 0;
}
스마트 포인터 형식
#include <memory>
int main()
{
shared_ptr<Parent> child_ptr = make_shared<Child>();
child_ptr->print(); // virtual에 의해 child 출력.
shared_ptr<Child> down_casting = dynamic_pointer_cast<Child>(child_ptr);
down_casting->newFunc();
return 0;
}