реализация класса" final " в C++

Я пытался понять код реализации "final" в cpp:

следующий код:

/* A program with compilation error to demonstrate that Final class cannot
   be inherited */

class Final;  // The class to be made final

class MakeFinal // used to make the Final class final
{
private:
    MakeFinal() { cout << "MakFinal constructor" << endl; }
friend class Final;
};

class Final : virtual MakeFinal
{
public:
    Final() { cout << "Final constructor" << endl; }
};

class Derived : public Final // Compiler error
{
public:
    Derived() { cout << "Derived constructor" << endl; }
};

int main(int argc, char *argv[])
{
    Derived d;
    return 0;
}

Вывод: Ошибка Компилятора

In constructor 'Derived::Derived()':
error: 'MakeFinal::MakeFinal()' is private

в этом я не мог понять логику фактически наследования класса MakeFinal. Мы могли бы просто унаследовать его (makeFinal class) как public и даже в этом случае мы не смогли бы наследовать его дальше(потому что конструктор Makefile является частным и только конечный класс является его друг может иметь доступ к нему).

любой указатель??

1 ответов


это не сработает. Не виртуальные базовые классы всегда инициализируются классом, который немедленно является производным от них. То есть, если бы сценарий был следующим:

class Final : public MakeFinal
{
public:
  Final() {}
};

class Derived : public Final
{};

тогда ctor Derived только инициализирует Final, что штраф (Final имеет публичный ctor). Final ' s ctor затем инициализирует MakeFinal, что также возможно, так как Final - друг.

однако для виртуальных базовых классов правило отличается. Все виртуальные базовые классы инициализации конструктор наиболее производного объекта. То есть при создании экземпляра Final, это Final ' s ctor, который инициализирует MakeFinal. Однако, при попытке создать экземпляр Derived, должно быть Derived's ctor, который инициализирует MakeFinal. И это невозможно, из-за MakeFinalчастный ctor.

также обратите внимание, что c++11 ввел ключевое слово final для классов (и виртуальные функции).