2010-12-28 5 views
1

이 코드는 '밀봉'클래스 구현을 건너 왔을 때 나는 http://www2.research.att.com/~bs/bs_faq2.html에 C++ FAQ를 읽고 있었다 : 가상 키워드를 사용하여, '봉인 방법봉인 클래스 구현 쿼리

class Base{ 
    public: 
     friend class A; 
    private: 
     Base(){cout<<"Base constructor called";} 
}; 

class A : public virtual Base{ 
    public: 
    A(){cout<<"A const called";} 
}; 

class B : private A{}; 

int main(){ 
    A a; 
    //B b; 
    return EXIT_SUCCESS; 
} 

내가 이해하지 못했다을 '클래스 효과가 달성됩니다. 가상 키워드를 제거하면 '봉인 된'효과가 없습니다. 왜?

답변

1

가상 상속의 작동 방식으로 인해 B가 Base를 생성해야하기 때문에 작동하지 않습니다. Base의 생성자가 private이기 때문에 작동합니다. 오직 A 만 Base를 만들 수 있습니다. 정상적인 상속에서 B는 A를 구성하여 A가 Base를 구성 할 수 있고 B가 A를 만들 수 있기 때문에 괜찮습니다.

+0

우리는 실제로 public virtual Base라고 말하면서 무엇을 말하고 있습니까? – badmaash

+0

@Abhi : Base가 사실상 상속되었다는 것입니다. 즉, A에서 파생 된 클래스와 Base에서 상속받은 다른 클래스의 경우 Base의 복사본이 여러 개가 아니라 여러 개가 있고 Base의 인스턴스는 대부분의 파생 클래스. 매우 복잡한 주제입니다. – Puppy

+0

개인 상속을 사용하면 어떻게됩니까? 개인 상속은 여기에서 괜찮습니까? 사실, 나는'private virtual' 상속이 잘 작동하는지 테스트했습니다. 그래서 사적 상속을 사용하는 것이 더 합리적 일 것이라고 생각합니다. 어떤 것은'A' 객체를 조작하기 위해'Base * '를 사용하기를 원하지 않는다. Base 클래스는 OOP 용으로 설계되지 않았다. 그것은 단지 유틸리티 일뿐입니다. Plz 주석. – zoujyjs

관련 문제