[C++] virtual 안붙이면 포인터 자료형!=인스턴스일 때 오버라이딩 안된다

YumeIroVillain·2022년 7월 25일
0

개발노트

목록 보기
14/28

인공신경망 만들다가 막힌 부분이
추상클래스에 대한 상속클래스의 인스턴스에서 멤버함수 오버라이딩이 제대로 이루어지지 않았다는 점인데,

/******************************************************************************

                              Online C++ Compiler.
               Code, Compile, Run and Debug C++ program online.
Write your code in this editor and press "Run" button to compile and execute it.

*******************************************************************************/

#include <iostream>

using namespace std;

class Parent
{
    public:
        virtual void call() {
            printf("Hello Parent!\n");
        }
};
class Child : public Parent {
    public:
        void call(){
            printf("Hello Child!\n");
        }
};

void importer(Parent* child){
    child->call();
}

int main()
{
    // Parent *A; // 가능
    // Parent *A = new Parent(); //에러
    Parent* A = new Child();
    importer(A);
    printf("Done.\n");
    return 0;
}

main 1,2번째줄은 무시해도 좋다.
이 때, virtual 붙였기 때문에

Hello Child!
Done.

이 나온다.


만약, 부모클래스의 멤버함수 앞에 virtual 을 붙이지 않았다면, 실제로는 자식인스턴스를 가리키는 부모포인터의 해당 멤버함수를 호출했을 때,
자식메소드가 아니라 부모메소드가 그대로 나와버린다.

/******************************************************************************

                              Online C++ Compiler.
               Code, Compile, Run and Debug C++ program online.
Write your code in this editor and press "Run" button to compile and execute it.

*******************************************************************************/

#include <iostream>

using namespace std;

class Parent
{
    public:
        // virtual void call() {
        void call() {
            printf("Hello Parent!\n");
        }
};
class Child : public Parent {
    public:
        void call(){
            printf("Hello Child!\n");
        }
};

void importer(Parent* child){
    child->call();
}

int main()
{
    // Parent *A; // 가능
    // Parent *A = new Parent(); //에러
    Parent* A = new Child();
    importer(A);
    printf("Done.\n");
    return 0;
}
Hello Parent!
Done.
profile
HW SW 둘다 공부하는 혼종의 넋두리 블로그 / SKKU SSE 17 / SWM 11th

0개의 댓글