• 카테고리

    질문 & 답변
  • 세부 분야

    프로그래밍 언어

  • 해결 여부

    해결됨

3분 30초 부근 질문 있습니다.

22.11.04 15:27 작성 조회수 200

0

그림을 보면 Der class의 가상표에 func1(), func2()가 있는데 저는 my_derived에 func2()가 없어도 상속 구조이므로 호출이 되어서 func2()이 실행이 되는데 virtual 키워드를 만나게 되므로 Base class의 가상표를 호출해서 fun2()가 실행되는 구조로 생각이 드는데 틀린 걸까요?

아니면 파생 클래스는 그보다 상위 클래스의 virtual function에 대한 포인터를 가상표에 다 지니고 있는 건가요?

답변 1

답변을 작성해보세요.

3

강민철님의 프로필

강민철

2022.11.05

사실 fun1()도 Der에 없어도 호출이 됩니다.

왜냐하면 Der 클래스는

아래 코드 기준 Base 클래스의

가상 함수에 해당하는 주소를 참조할 수 있기 때문입니다.

#include <iostream>

using namespace std;

class Base
{
public:
    void fun1() {cout<<"1"<<endl;};
    void fun2() {cout<<"2"<<endl;};
};

class Derived : public Base
{
};

int main()
{

    Base b;
    Derived d;

    b.fun1();
    b.fun2();
    d.fun1();
    d.fun2();

    return 0;
}

 

그보다 상위 클래스의 virtual function에 대한 포인터를 가상표에 다 지니고 있는 건가요?

라는 말씀이 옳아 보입니다.

https://musket-ade.tistory.com/entry/C-%EA%B0%80%EC%83%81%ED%95%A8%EC%88%98-%ED%85%8C%EC%9D%B4%EB%B8%94-V-Table

박제영님의 프로필

박제영

2023.01.17

저도 궁금햇던 내용이고 질문이 넘 좋네요

1번 경우라면

func2() 호출하기 위해

vptr2->찾아보니 없음->vptr1->func() 이렇게 호출될거고

vptr2가 vtpr1의 테이블 내용도 다 가지고 잇으면 func1과 포인터 연산이 동일하게 되니깐요

똑똑한 사람들이 만들엇으니 2번처럼 햇을거 같네요