이 코드입니다 :C++의 개체 조각화에 대한 가능한 해결 방법은 무엇입니까?
#include <string>
#include <vector>
#include <iostream>
using namespace std;
class A {
public:
virtual const string f() const { return "A"; }
};
class B : public A {
public:
const string f() const { return "B"; }
};
int main(int ac, char** av) {
vector<A> v;
v.push_back(B());
cout << v.at(0).f() << endl;
return 0;
}
예상 결과가 B
이지만, A
을합니다. 내가 이해하는대로 개체 조각이 일어나고있다. 어떻게 피하는가? 객체 인스턴스가 아닌 vector
에 포인터를 저장해야합니까? 이것이 유일한 선택일까요?
개체 분할은 잘못된 결과를 초래하는 것이 아니라 멤버 연산자 (.)에 의한 함수 호출입니다. 가상 함수는 멤버 별 연산자 (->) (다음을 제외하고는 호출해야합니다. 참조를 사용할 때) – Ozan
@Ozan : 말도 안돼. 다른 멤버 함수 (virtual 또는 not)에서 가상 멤버 함수를 호출하면 가상 호출이 발생합니다. – MSalters
네, 저는 빈체 자에게 오브젝트 슬라이싱이 아닌 멤버 연산자를 사용하는 것이 범인이라는 것을 지적하고 싶었습니다. java/C# 사람들이 C++ – Ozan