заявка за изпълнение на запечатан клас

Четох често задаваните въпроси за 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;
}

Не разбрах как с помощта на виртуалната ключова дума се постига ефект на „запечатан“ клас. Ако премахна виртуалната ключова дума, тогава тя няма „запечатан“ ефект. Защо?


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