Возможно ли наследование class <---> struct в c++?

144
18 июля 2019, 08:00

Насколько я понимаю, они оба поддерживают наследование, оба могут содержать поля и функции, оба могут содержать конструктор и деструктор, оба поддерживают наследование. Разница в том, что функции и переменные без ключевого слова private/protected/public одним по умолчанию отправляются в раздел private, другим в раздел public. Возможно ли наследование struct из родителя class и наоборот? Если да, то каким образом будут преобразованы поля без модификатора? Например, отправляя из class в дочерний struct они останутся private или станут public? Если нет, то почему нет? Наследование имею ввиду полное, модификатор наследования public.

Answer 1

Наследование возможно.

Члены struct ведут себя так, как будто в начале определения struct стоит неявный спецификатор доступа public, а члены class - как будто в начале определения стоит неявный спецификатор доступа private

struct S
{
  // public:
  ...
};
class C
{
  // private:
  ...
};

При наследовании, если наследник является struct, то наследование выполняется как public по умолчанию. Если наследник является class, то наследование выполняется как private по умолчанию.

struct DS : Parent // эквивалентно `struct DS : public Parent`
{
  ...
};
class DC : Parent // эквивалентно `class DC : private Parent`
{
  ...
};

А далее работают одни и те же общие правила, единые и для class, и для struct: более ограничивающий уровень доступа "побеждает" более расслабленный уровень доступа.

Answer 2

Поскольку struct - это class с public по умолчанию, действуют все те же правила, как если бы это был класс, члены которого объявлены как public - понятно, те, которые объявлены без модификатора. Члены, объявленные с модификатором, ведут себя точно так же, как если бы этот тип был объявлен как class.

Надеюсь, описывать правила доступа при наследовании тут не нужно? :) А то можно не успеть их закончить в 2018 году :)

READ ALSO
OverflowError: Python int too large to convert to C long

OverflowError: Python int too large to convert to C long

Когда пытаюсь выполнить скрипт bimbampy выходит эта ошибка:

137
OpenMP как оптимальней декларировать цикл

OpenMP как оптимальней декларировать цикл

Как более правильно описать цикл примерно для следующей схемы кода:

146
Рандомайзер выводит одинаковые числа [закрыт]

Рандомайзер выводит одинаковые числа [закрыт]

Для генерации случайных чисел использую rand() перед этим иницииирую таймер srand(time(NULL));, но при каждом перезапуске программы числа одинаковые

116
case игнорирует ввод строки

case игнорирует ввод строки

Почему в случае ch = 3 в case игнорируется строка gets_s(text, 150)? То есть при срабатывании этого case программа не дает возможности ввести text

165