C++/Class
2021. 3. 21. 23:51
객체 잘림 (Object Slicing)
- 부모 클래스 자료형에 자식 클래스 자료형을 대입할 경우, 흔히 말하는
truncation
이 발생한다.
예제
#include <iostream>
class Base
{
public:
int i_ = 0;
virtual void print()
{
std::cout << "I'm Base\n";
}
};
class Derived : public Base
{
public:
int j_ = 1;
virtual void print() override
{
std::cout << "I'm Derived\n";
std::cout << "j_ : " << j_ << '\n';
}
};
void doSomething1(Base& b)
{
b.print();
}
void doSomething2(Base b)
{
b.print();
}
int main()
{
using namespace std;
Derived d;
Base& b1 = d;
Base b2 = d;
b1.print();
b2.print();
cout << endl;
doSomething1(b1);
doSomething2(b1);
}
/* stdout
I'm Derived
j_ : 1
I'm Base
I'm Derived
j_ : 1
I'm Base
*/
b1
의 경우 레퍼런스로 전달하여 다형성이 적용된다.b2
의 경우 값을 복사한 것이므로 자식 클래스(Derived
)가 아닌 부모 클래스(Base
)로 인식한다.- 이 경우 다형성을 사용할 수 없다.
reference_wrapper
std::vector의 경우 템플릿에 레퍼런스를 넣을 수 없다.
- 이럴 때 포인터로 구현을 해도 되지만, 레퍼런스로 구현하려면 reference_wrapper를 사용하면 된다.
'C++ > Class' 카테고리의 다른 글
C++ 유도 클래스에서 출력 연산자 사용하기 (0) | 2021.03.21 |
---|---|
C++ 동적 형변환 (Dynamic Casting) (0) | 2021.03.21 |
C++ 다이아몬드 상속 (Diamond Polymorphism) (0) | 2021.03.21 |
C++ 인터페이스 클래스 (Interface Class) (0) | 2021.03.21 |
C++ 추상 기본 클래스 (Abstract class) (0) | 2021.03.21 |