запрос реализации запечатанного класса - PullRequest
1 голос
/ 28 декабря 2010

Я читал часто задаваемые вопросы 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;
}

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

1 Ответ

1 голос
/ 28 декабря 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...