class B {
private:
friend class C;
B() = default;
};
class C : public B {};
class D : public B {};
int main() {
C {};
D {};
return 0;
}
Я предположил, что, поскольку только класс C
является другом B
, а конструктор B
является закрытым, то действительным является только класс C
а D
не может создавать экземпляр B
Но это не так, как это работает. Где я ошибаюсь в своих рассуждениях и как добиться такого контроля над тем, какие классы могут наследовать определенную базу?
Обновление: как отмечалось другими в комментариях, приведенный выше фрагмент работает так, как я первоначально ожидал в С++ 14, но не в С++ 17. Изменение экземпляра на C c; D d;
C c; D d;
Функция main()
также работает, как и ожидалось, в режиме С++ 17.