[c++] 같은 클래스를 상속받은 서로 다른 클래스의 객체들을 배열처럼 묶을 수 있나요?


A라는 클래스를 B,C,D가 상속 받았습니다 그리고 B,C,D의 객체들을 배열처럼 묶을 수 있나요? arr[0]=B 객체 arr[1]=C 객체 arr[2]=D 객체 이런식으로 인덱스에 접근도 가능하게 할 수 있나요?

  • 2017년 12월 17일에 작성됨

조회수 191


Banner nodejs

2 답변


A클래스의 포인터 배열을 만들어서 B,C,D의 객체들을 업캐스팅으로 하니까 원하는대로 나오긴 하는거 같은데 이런식으로 사용해도 괜찮은건가요?

  • 2017년 12월 17일에 작성됨


상속받은 클래스들을 하나의 배열에서 관리하기 위해서는 부모의 타입으로 변환하여 사용하는 방법이 있습니다.

#include <iostream>
#include <memory>

struct A {
    virtual ~A() {}
    virtual void print() { std::cout << "A" << std::endl; }
};
struct B : public A { 
    void print() { std::cout << "B" << std::endl; }
};
struct C : public A {
    void print() { std::cout << "C" << std::endl; }
};

int main() {
    A* array[] = {
        new B
        , new C
    };

    for (std::size_t i = 0, size = sizeof(array) / sizeof(array[0]); i < size; ++i)
        array[i]->print();

    for (std::size_t i = 0, size = sizeof(array) / sizeof(array[0]); i < size; ++i)
        delete array[i];

    return 0;
}

위 방법은 메모리를 직접 관리해 줘야하기 때문에 불편함이 있습니다. 여기서 스마트 포인터를 적용하면 아래와 같습니다.

#include <iostream>
#include <memory>

struct A {
    virtual ~A() {}
    virtual void print() { std::cout << "A" << std::endl; }
};
struct B : public A { 
    void print() { std::cout << "B" << std::endl; }
};
struct C : public A {
    void print() { std::cout << "C" << std::endl; }
};

int main() {
    std::unique_ptr<A> array[] = {
        std::unique_ptr<B>(new B)
        , std::unique_ptr<C>(new C)
    };

    for (std::size_t i = 0, size = sizeof(array) / sizeof(array[0]); i < size; ++i)
        array[i]->print();

    return 0;
}
  • 2017년 12월 17일에 작성됨

로그인이 필요한 기능입니다.

Hashcode는 개발자들을 위한 무료 QnA사이트 입니다. 작성한 답변에 다른 개발자들이 댓글을 작성하거나 좋아요/싫어요를 할 수 있기 때문에 계정을 필요로 합니다.
► 로그인
► 계정만들기
Close