const Class *의 컴파일 에러

dictions의 이미지

안녕하세요.

const AbstractClass *c = new ConcreteClass("argstring");
c->execute();

error C2662: 'AbstractClass::execute: 'this' 포인터를 'const AbstractClass'에서 'AbstractClass &'(으)로 변환할 수 없습니다.
1>        변환하면서 한정자가 손실됩니다.

이 녀석 컴파일이 안되는군요.

AbstractClass *c = new ConcreteClass("argstring");
c->execute();

이 녀석은 됩니다.

결국 const한정자로 Class *생성할 때가 문제라는 건데...
안 될 이유가 있나요?

(문제의 해결은 const때면 되지만, const붙여서 쓰고싶을 수도 있으니까요.. 궁금하네요 ^^)

여러분의 조언을 구합니다.
감사합니다.

M.W.Park의 이미지

const_cast를 사용하거나, new 연산자를 하나 만들어 주면 될것같네요.

-----
오늘 의 취미는 끝없는, 끝없는 인내다. 1973 法頂

-----
오늘 의 취미는 끝없는, 끝없는 인내다. 1973 法頂

kukyakya의 이미지

execute() 멤버 함수가 const 타입이면 문제 없이 실행되지 않을까요?

void execute() const {
...
}

dictions의 이미지

네, 이미 저 코드에서

void execute() const = 0;

입니다.

저 코드만으로는 알 수가 없군요.
제 설명이 부족했습니다.
죄송하고, 함께 고민해주셔서 감사합니다. ^^

bugiii의 이미지

다음과 같이 했는데 컴파일이 안된다는 것인가요? 그리고, 올리신 컴파일 에러는 객체 생성이 문제가 아니라 exec 호출이 문제가 된다는 것입니다. exec에 const를 빼면 당연히 상수 객체 포인터의 exec를 호출할 수 없는 것이고요.

class A
{
public:
        A() {}
        virtual ~A() {}
        virtual void exec() /**/ const /**/ = 0;
};
 
class B : public A
{
public:
        B() {}
        ~B() {}
        void exec() /**/ const /**/ {};
};
 
int main()
{
        const A* a = new B;
        a->exec();
 
        return 0;
}