developer tip

dynamic_cast를 사용하려고 할 때 "소스 유형이 다형성이 아닙니다."

optionbox 2020. 12. 8. 07:59
반응형

dynamic_cast를 사용하려고 할 때 "소스 유형이 다형성이 아닙니다."


struct A {};

struct B : A {};

int main()
{
    A* a = new B();

    B* b = dynamic_cast<B*>(a);
}

제공합니다 :

'a'( 'struct A *'유형)를 'struct B *'유형으로 dynamic_cast 할 수 없습니다 (소스 유형은 다형성이 아님).

A다형성을 어떻게 만들 수 있습니까? 안전하게 B에게 캐스팅하고 싶습니다.

(한 가지 방법은 더미 가상 기능을 추가하는 것이지만 더 좋은 방법이 있습니까?)


소멸자 또는 가상 함수를 A추가하여 수행 할 수있는 다형성 을 만들어야 virtual합니다.

struct A {
  virtual ~A() = default;
};

또는 C ++ 11 이전에

struct A {
  virtual ~A() {}
};

기본에 대한 포인터를 통해 파생 된 유형의 인스턴스에 대해 안전하게 delete를 호출하려는 경우 다형성 유형에는 가상 소멸자가 있어야합니다.


적어도 하나의 virtual함수 가 필요합니다. 일반적으로 다른 함수가 적합하지 않은 경우 소멸자는 다음을 수행합니다.

struct A {
   virtual ~A() {}
}; 

컴파일러가 말했듯이 유형 A은 다형성이 아닙니다. 여기에 virtual기능을 추가해야 합니다. 예를 들어 virtual소멸자는 좋은 선택이 될 수 있습니다.

struct A { virtual ~A() { } };
//         ^^^^^^^ This makes A a polymorphic type

struct B : A {};

int main()
{
    A* a = new B();

    B* b = dynamic_cast<B*>(a); // Should work now
}

참고 URL : https://stackoverflow.com/questions/15114093/getting-source-type-is-not-polymorphic-when-trying-to-use-dynamic-cast

반응형