запрос реализации запечатанного класса

Я читал часто задаваемые вопросы по 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 достигается эффект «запечатанного» класса. Если я удалю виртуальное ключевое слово, оно не будет иметь «запечатанного» эффекта. Почему?


person badmaash    schedule 28.12.2010    source источник


Ответы (1)


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

person Puppy    schedule 28.12.2010
comment
Что мы на самом деле говорим, говоря - публичная виртуальная База? - person badmaash; 28.12.2010
comment
@Abhi: что Base наследуется виртуально, то есть для любого класса, производного от A, и любого другого класса, который виртуально наследуется от Base, существует только одна копия Base, а не несколько, и этот экземпляр Base создается большинством производный класс. Это очень сложная тема. - person Puppy; 28.12.2010
comment
Что, если я использую частное наследование? Подойдет ли здесь частное наследование? На самом деле, я проверил, что наследование private virtual работает нормально. Так что я думаю, что использование приватного наследования здесь будет более разумным. В конце концов, вы не хотите, чтобы кто-то использовал Base* для управления объектом A, базовый класс не предназначен для ООП. Это просто полезность. Комментарии плз. - person Joey.Z; 20.08.2013