[Basic C++] #21_가상 상속

2022. 5. 1. 21:00· 언어/Basic C++
목차
  1. [Basic C++] #21_가상 상속

[Basic C++] #21_가상 상속

 

C++ 개발에 사용되는 "가상 상속"개념에 대해 알아보겠습니다.

 


 

Overview

 

  1. 개념
  2. 코드

 

#0. 개념
class Animal
{
public:
    virtual void eat() = 0;
    virtual void sleep() {cout << "zzzzzz....." << endl;}
};

class Dog : public Animal
{
public:
    virtual void eat() override {cout << "Eat Method is called! " << endl; }
    virtual void bark() {cout << "Bark!" << endl;}
};

class Bird : public Animal
{
    virtual void eat() override {cout << "Eat Method is called!" << endl;}
    virtual void chirp() {cout << "Chirp!" << endl;}
};

class DogBird : public Dog, Bird
{
public:
    virtual void eat() override {Dog::eat();}
};

int main ()
{
    DogBird myDogBird;
    myDogBird.sleep();	// 모호성 발생!!
    return 0;
}

 

Details

 

  • C++는 다중 상속으로 인해 상속 계층 구조에서 나타나는 다중 인스턴스를 방지하기 위해 "가상 상속" 기능을 제공합니다.
  • 위 예제를 살펴보면, 가장 상위의 Animal 클래스를 Dog 클래스와 Bird 클래스가 상속합니다. 최종적으로 DobBird 클래스가 Dog 클래스와 Bird 클래스를 다중 상속합니다. 
  • 이때, DogBird 객체를 생성하여 Animal 클래스의 함수를 호출해 봅시다. 해당 메서드는 Dog 객체가 상속하는 Animal 객체의 메서드일까요? 아니면 Bird 클래스가 상속하는 Animal 객체의 메서드일까요? 모호성이 발생합니다!
  • 이때, "가상 상속"을 사용합니다. 아래 예제를 살펴보시죠!

 

#1. 코드

1. Animal 코드 수정

class Animal {

public:
    virtual void Eat() { cout << " Eat! " << endl; }
    
};

class Dog : virtual public Animal {};

class Bird : virtual public Animal {};

class DogBird : public Dog, Bird {};

int main()
{
    DogBird* DogBirdInst = new DogBird();
    DogBirdInst->Eat(); // 모호성 해결! 
    
    delete DogBird;
    
    return;
}

 

Details

 

  • 가상 상속 사용 방법은 간단합니다.
  • 가상 상속 시 public 키워드 대신 "virtual public" 키워드를 사용합니다.

 

 

 

 

 

'언어 > Basic C++' 카테고리의 다른 글

[Basic C++] #24_우측 값 참조, 대입 연산의 좌항과 우항  (0) 2022.05.14
[Basic C++] #23_참조형 파라미터, 참조에의한 전달  (0) 2022.05.08
[Basic C++] #20_virtual 키워드, vtable 오버헤드  (0) 2022.05.01
[Basic C++] #19_virtual, virtual의 내부 구현  (0) 2022.04.30
[Basic C++] #18_오버라이딩의 특수한 경우 여섯 번째, 일반 메소드의 오버라이딩  (0) 2022.04.30
  1. [Basic C++] #21_가상 상속
'언어/Basic C++' 카테고리의 다른 글
  • [Basic C++] #24_우측 값 참조, 대입 연산의 좌항과 우항
  • [Basic C++] #23_참조형 파라미터, 참조에의한 전달
  • [Basic C++] #20_virtual 키워드, vtable 오버헤드
  • [Basic C++] #19_virtual, virtual의 내부 구현
Hardii2
Hardii2
Hardii2
개발 블로그
Hardii2
전체
오늘
어제
  • 분류 전체보기
    • 알고리즘
    • 웹 개발
      • Node.js
      • React
    • 게임개발
      • DirectX12
      • 관련 지식
      • Unreal C++
      • Unreal 블루프린트
    • 언어
      • Effective C++
      • Basic C++
      • 디자인 패턴
      • 자료구조
      • 기술 질문
    • 문제 풀이
      • BOJ 문제 풀이
      • Programmers 문제 풀이
      • geeksForgeeks 문제 풀이
    • 수학
      • 확률과 통계
      • 게임수학
    • 개인프로젝트
    • 그룹프로젝트
      • PM
      • Dev
    • Github

블로그 메뉴

  • 홈
  • 글쓰기

공지사항

인기 글

태그

  • 그래프
  • 디자인 패턴
  • 우선순위 큐
  • dfs
  • 기술 질문
  • 정렬
  • Effective C++
  • 알고리즘
  • 트리
  • unreal
  • programmers
  • 최단 경로
  • BFS
  • DP
  • stl
  • set
  • C++
  • Unreal Blueprint
  • 개발
  • BOJ

최근 댓글

최근 글

hELLO · Designed By 정상우.v4.2.2
Hardii2
[Basic C++] #21_가상 상속
상단으로

티스토리툴바

개인정보

  • 티스토리 홈
  • 포럼
  • 로그인

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.