이름(식별자)과 실제 값(객체, 함수 등)을 연결하는 과정
#include <iostream> using namespace std; class Animal { public: void speak() { // virtual 없음 cout << "동물 소리" << endl; } void eat() { cout << "동물이 먹습니다" << endl; } }; class Dog : public Animal { public: void speak() { // 함수 hiding (오버라이딩 아님!) cout << "멍멍!" << endl; } void eat() { cout << "개가 사료를 먹습니다" << endl; } }; int main() { cout << "=== 직접 객체 사용 ===" << endl; Animal a; Dog d; a.speak(); // Animal::speak() - 정적 바인딩 d.speak(); // Dog::speak() - 정적 바인딩 cout << "\n=== 포인터 사용 ===" << endl; Animal* ptr1 = new Animal(); Animal* ptr2 = new Dog(); // Dog 객체지만 Animal* 타입 ptr1->speak(); // Animal::speak() - 정적 바인딩 ptr2->speak(); // Animal::speak() - 정적 바인딩 (포인터 타입 기준!) ptr1->eat(); // Animal::eat() ptr2->eat(); // Animal::eat() (Dog::eat()이 호출되지 않음!) delete ptr1; delete ptr2; return 0; }
#include <iostream> using namespace std; class Animal { public: virtual void speak() { // virtual 추가! cout << "동물 소리" << endl; } virtual void eat() { cout << "동물이 먹습니다" << endl; } virtual ~Animal() { cout << "Animal 소멸" << endl; } }; class Dog : public Animal { public: void speak() override { cout << "멍멍!" << endl; } void eat() override { cout << "개가 사료를 먹습니다" << endl; } ~Dog() { cout << "Dog 소멸" << endl; } }; class Cat : public Animal { public: void speak() override { cout << "야옹~" << endl; } void eat() override { cout << "고양이가 생선을 먹습니다" << endl; } ~Cat() { cout << "Cat 소멸" << endl; } }; int main() { cout << "=== 직접 객체 사용 ===" << endl; Animal a; Dog d; Cat c; a.speak(); // Animal::speak() d.speak(); // Dog::speak() c.speak(); // Cat::speak() cout << "\n=== 포인터 사용 (동적 바인딩) ===" << endl; Animal* ptr1 = new Animal(); Animal* ptr2 = new Dog(); Animal* ptr3 = new Cat(); ptr1->speak(); // Animal::speak() - 동적 바인딩 ptr2->speak(); // Dog::speak() - 동적 바인딩 (실제 객체 확인!) ptr3->speak(); // Cat::speak() - 동적 바인딩 ptr1->eat(); // Animal::eat() ptr2->eat(); // Dog::eat() (실제 타입에 따라 호출!) ptr3->eat(); // Cat::eat() cout << "\n=== 메모리 해제 ===" << endl; delete ptr1; delete ptr2; // Dog 소멸자 먼저, 그 다음 Animal 소멸자 delete ptr3; // Cat 소멸자 먼저, 그 다음 Animal 소멸자 return 0; }