class Animal
{
public:
Animal& operator=(const Animal& animal);
};
class Lizard : public Animal
{
public:
Lizard& operator=(const Lizard& lizard);
};
class Chicken : public Animal
{
public:
Chicken& operator=(const Chicken& chicken);
};
Lizard liz1;
Lizard liz2;
Animal* pAnimal1 = &liz1;
Animal* pAnimal2 = &liz2;
*pAnimal1 = *pAnimal2;
마지막 호출되는 대입 연산자는 Animal::operator==이므로 Animal 클래스 부분만 바뀌는 부분 대입 현상 발생
class Animal
{
public:
virtual Animal& operator=(const Animal& animal);
};
class Lizard : public Animal
{
public:
virtual Animal& operator=(const Animal& animal);
};
class Chicken : public Animal
{
public:
virtual Animal& operator=(const Animal& animal);
};
Lizard liz1;
Chicken chick;
Animal* pAnimal1 = &liz1;
Animal* pAnimal2 = &chick;
*pAnimal1 = *pAnimal2;
가상 함수로 구현할 경우 매개변수의 타입을 기본 클래스와 동일하게 해야 하기 때문에 Lizard에 Chicken을 대입하는 타입 불일치 대입 현상이 발생할 수 있음
class Animal
{
protected:
Animal& operator=(const Animal& animal);
};
class Lizard : public Animal
{
public:
Lizard& operator=(const Lizard& lizard);
};
class Chicken : public Animal
{
public:
Chicken& operator=(const Chicken& chicken);
};
Lizard liz1;
Lizard liz2;
Animal* pAnimal1 = &liz1;
Animal* pAnimal2 = &liz2;
*pAnimal1 = *pAnimal2; // error
기본 클래스 타입으로 대입 연산을 막기 위해 operator=을 protected로 선언
타입 불일치 대입 현상도 막을 수 있음
아예 기본 클래스의 인스턴스화를 막기 위해 추상 클래스로 선언
- 추상 클래스로 선언할 때는 한 개 이상의 순수 가상 함수를 선언해야 함
class Animal
{
public:
virtual void ~Animal() = 0;
protected:
Animal& operator=(const Animal& animal);
};
'C++ > More Effective C++' 카테고리의 다른 글
[More Effective C++] 항목 31 함수를 두 개 이상의 객체(타입)에 대해 가상 함수처럼 동작하도록 만들기 (0) | 2025.04.01 |
---|---|
[More Effective C++] 항목 30 프록시(Proxy) 클래스 (0) | 2025.03.29 |
[More Effective C++] 항목 28 스마트 포인터 (0) | 2025.03.20 |
[More Effective C++] 항목 26 클래스 인스턴스의 개수를 의도대로 제한하는 방법 (0) | 2025.03.17 |
[More Effective C++] 항목 24 가상 함수, 다중 상속, 가상 기본 클래스, RTTI에 들어가는 비용을 제대로 파악하자 (0) | 2025.03.15 |