이 비슷한 기능이 있습니까? 이렇게하면 오류가 발생합니다.가상의 비 방법 구성원
class A {
public:
virtual std::string key;
};
class B : public A {
public:
std::string key;
};
int main()
{
A a;
a.key = "Foo";
return 1;
}
이 비슷한 기능이 있습니까? 이렇게하면 오류가 발생합니다.가상의 비 방법 구성원
class A {
public:
virtual std::string key;
};
class B : public A {
public:
std::string key;
};
int main()
{
A a;
a.key = "Foo";
return 1;
}
아니요, 이것이 실제로 이해가되지 않기 때문입니다. 하위 클래스에는 상위 클래스의 모든 멤버가 포함됩니다. 따라서 B
은 여전히 A
의 std::string key
입니다. 또한 B
의 std::string key
이 같은 유형이기 때문에 은 완전히 동일합니다.에서 A
까지 - 우선 무시할 점은 무엇입니까?
또한 건설 중에 A
의 생성자를 실행할 때 B
의 가상 메서드는 호출되지 않습니다. 즉, A
의 구조 중에 key
에 액세스하면 A
의 키를 얻을 수 있습니다. 그러나 B
이 생성되면 그 key
은 음영 처리되며 해당 데이터는 완전히 액세스 할 수 없습니다.
class A {
private:
std::string m_key;
public:
virtual std::string &key() { return m_key; }
virtual const std::string &key() const { return m_key; }
};
class B : public A {
private:
std::string m_key;
public:
virtual std::string &key() { return m_key; }
virtual const std::string &key() const { return m_key; }
};
int main()
{
B b;
b.key() = "Foo";
return 0;
}
클래스 메소드 코드입니다 : 당신이 정말로 이런 일을하고 싶지 않는 경우 말했다
는, 어떤 이유로, 당신은 가상 접근 기능을 사용해야합니다. 코드는 일정합니다. 각 특정 클래스 메소드에는 컴파일 타임에 정의 된 미리 결정된 고정 동작이 있으며 런타임에 변경할 수 없습니다. 이런 이유로, 다형성 클래스를 가지려면, 미리 컴파일 타임에 다른 메소드의 많은 다른 버전을 작성한 다음 런타임에 특정 버전의 클래스 인스턴스를 클래스 인스턴스에 "첨부"해야합니다. 각 인스턴스의 특정 런타임 동작
데이터 멤버와 상황은 완전히 다릅니다. 데이터 멤버는 고정되어 있지 않습니다. 그들은 변할 수 있습니다. 그것들은 값을 가지며이 값들은 런타임에 자유롭게 바뀔 수 있습니다. 이것만으로도 데이터 멤버를 본질적으로 "가상"으로 만듭니다. 파생 클래스에 다른 "버전"의 데이터 멤버를 도입 할 필요는 없습니다. 대신, 기존 데이터 멤버에 다른 값을 입력하면됩니다. 이것만으로도 이미 클래스 메소드의 "가상"과 유사합니다. 또한이 "데이터 가상화"는 메서드의 "가상"보다 훨씬 융통성이 있습니다. 데이터 멤버를 사용하면 미리 정의 된 값 집합에 국한되지 않기 때문입니다.
당신이 제안하는 것은 높은 수준의 "가상"처럼 보입니다 : 데이터 멤버의 값은 변경 가능할뿐만 아니라 데이터 멤버 자체도 무시할 수 있습니다. (메타 가상 또는 초 가상 또는 이중 가상이라고 부릅니다.) 그러나이 기능을 사용하는 요점, 이점, 유스 케이스는 무엇입니까? 나는 개인적으로 즉시 그것을 보지 않으며 당신의 코드 샘플은 정확하게 말하지 않는다.
당신이 찾고있는 행동이 명확하지 않습니다. main() 함수에 더 많은 코드를 추가하면 도움이 될 것입니다. 아니요, 데이터 멤버를 가상으로 만드는 것은 의미가 없습니다. – zumalifeguard