2009-10-17 4 views
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; 
} 
+0

당신이 찾고있는 행동이 명확하지 않습니다. main() 함수에 더 많은 코드를 추가하면 도움이 될 것입니다. 아니요, 데이터 멤버를 가상으로 만드는 것은 의미가 없습니다. – zumalifeguard

답변

8

아니요, 이것이 실제로 이해가되지 않기 때문입니다. 하위 클래스에는 상위 클래스의 모든 멤버가 포함됩니다. 따라서 B은 여전히 ​​Astd::string key입니다. 또한 Bstd::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; 
} 
0

클래스 메소드 코드입니다 : 당신이 정말로 이런 일을하고 싶지 않는 경우 말했다

, 어떤 이유로, 당신은 가상 접근 기능을 사용해야합니다. 코드는 일정합니다. 각 특정 클래스 메소드에는 컴파일 타임에 정의 된 미리 결정된 고정 동작이 있으며 런타임에 변경할 수 없습니다. 이런 이유로, 다형성 클래스를 가지려면, 미리 컴파일 타임에 다른 메소드의 많은 다른 버전을 작성한 다음 런타임에 특정 버전의 클래스 인스턴스를 클래스 인스턴스에 "첨부"해야합니다. 각 인스턴스의 특정 런타임 동작

데이터 멤버와 상황은 완전히 다릅니다. 데이터 멤버는 고정되어 있지 않습니다. 그들은 변할 수 있습니다. 그것들은 값을 가지며이 값들은 런타임에 자유롭게 바뀔 수 있습니다. 이것만으로도 데이터 멤버를 본질적으로 "가상"으로 만듭니다. 파생 클래스에 다른 "버전"의 데이터 멤버를 도입 할 필요는 없습니다. 대신, 기존 데이터 멤버에 다른 값을 입력하면됩니다. 이것만으로도 이미 클래스 메소드의 "가상"과 유사합니다. 또한이 "데이터 가상화"는 메서드의 "가상"보다 훨씬 융통성이 있습니다. 데이터 멤버를 사용하면 미리 정의 된 값 집합에 국한되지 않기 때문입니다.

당신이 제안하는 것은 높은 수준의 "가상"처럼 보입니다 : 데이터 멤버의 값은 변경 가능할뿐만 아니라 데이터 멤버 자체도 무시할 수 있습니다. (메타 가상 또는 초 가상 또는 이중 가상이라고 부릅니다.) 그러나이 기능을 사용하는 요점, 이점, 유스 케이스는 무엇입니까? 나는 개인적으로 즉시 그것을 보지 않으며 당신의 코드 샘플은 정확하게 말하지 않는다.

관련 문제