>백엔드 개발 >C++ >다형성이 C의 명령 개체 벡터와 작동하지 않는 이유는 무엇입니까?

다형성이 C의 명령 개체 벡터와 작동하지 않는 이유는 무엇입니까?

Barbara Streisand
Barbara Streisand원래의
2024-11-02 14:41:29646검색

Why Doesn't Polymorphism Work with a Vector of Instruction Objects in C  ?

C의 벡터와 다형성

다형성을 사용하면 서로 다른 클래스의 객체가 공통 인터페이스를 공유할 수 있습니다. C에서 이는 일반적으로 상속 및 가상 함수를 통해 달성됩니다.

다음 코드 조각을 고려하세요.

<code class="cpp">class Instruction
{
public:
    virtual void execute() {  }
};

class Add: public Instruction
{
private:
    int a;
    int b;
    int c;
public:
    Add(int x, int y, int z) {a=x;b=y;c=z;}
    void execute() { a = b + c;  }
};</code>

여기에서 Instruction 클래스는 가상 실행 메서드를 정의합니다. 클래스를 추가합니다.

이제 Instruction 개체가 포함된 벡터를 만들어 보겠습니다.

<code class="cpp">vector<Instruction> v;
Instruction* i = new Add(1,2,3);
v.push_back(*i);</code>

다른 방법으로는 벡터의 마지막 요소를 검색하고 해당 실행 메서드를 호출합니다.

<code class="cpp">Instruction ins = v.back();
ins.execute();</code>

효과가 있을까요?

아니요, 그렇지 않습니다. 벡터는 참조가 아닌 값을 저장합니다. 이는 Add 객체가 벡터에 복사되어 객체 슬라이싱이 발생한다는 의미입니다.

수정 방법

다형성을 유지하려면 벡터를 사용해야 합니다. 포인터:

<code class="cpp">vector<Instruction*> v;
v.push_back(i);</code>

또는 std::reference_wrapper:

<code class="cpp">vector<std::reference_wrapper<Instruction>> v;
v.push_back(i);</code>

의 벡터를 사용할 수 있습니다. 이렇게 하면 객체가 슬라이스되지 않고 유지될 수 있습니다. 동적 유형을 선택하고 가상 함수를 올바르게 호출하세요.

위 내용은 다형성이 C의 명령 개체 벡터와 작동하지 않는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.