문제:
다음 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>
명령어 참조의 벡터가 생성되고 역참조된 값을 푸시백하여 Add 개체가 벡터에 추가됩니다.
<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 유형을 유지하고 코드가 올바르게 실행됩니까?
답변:
아니요, 그렇지 않습니다.
벡터
게다가 new 연산자는 Add 개체에 메모리를 할당하는 데 사용됩니다. 그러나 객체가 삭제되지 않기 때문에 메모리 누수가 발생합니다.
이 시나리오를 올바르게 구현하려면 Instruction* 또는 std::reference_wrapper
<code class="cpp">vector<Instruction*> ins;</code>또는
<code class="cpp">vector< std::reference_wrapper<Instruction> > ins;</code>
추가 참고:
이 문제에 설명된 동작을 객체 슬라이싱이라고 합니다.위 내용은 객체 슬라이싱이 C 벡터의 다형성에 영향을 줍니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!