2010-12-28 2 views
1

Я читал C++ часто задаваемые вопросы по http://www2.research.att.com/~bs/bs_faq2.html, когда я наткнулся на этот код, чтобы реализовать «запечатанный» класс:реализация запечатанный класс запроса

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; 
} 

Я не понимаю, как с помощью виртуального ключевого слова «запечатаны «эффект класса». Если я удалю ключевое слово virtual, то он не имеет эффекта «запечатанного». Зачем?

ответ

1

Он работает, потому что из-за того, что виртуальное наследование работает, B должен построить Base-which, которого он не может, потому что конструктор базы является закрытым. Только А может построить базу. В нормальном наследовании B строит A, который строит Base, что отлично, потому что A может построить Base и B может построить A.

+0

Что мы говорим на самом деле, говоря: общедоступная виртуальная база? – badmaash

+0

@Abhi: что база наследуется практически, т. Е. Для любого класса, производного от A и любого другого класса, который фактически наследуется от Base, имеется только одна копия Base, а не несколько, и этот экземпляр Base строится с помощью самый производный класс. Это очень сложная тема. – Puppy

+0

Что делать, если я использую личное наследование? Будет ли здесь частное наследство? На самом деле, я тестировал, что наследование «private virtual» отлично работает. И поэтому я считаю, что использование частного наследования будет здесь более разумным. В конце концов, вы не хотите, чтобы кто-то использовал 'Base *' для управления объектом 'A', базовый класс не предназначен для OOP. Это просто полезность. Plz комментирует. – zoujyjs

Смежные вопросы