LINUX.ORG.RU

История изменений

Исправление alysnix, (текущая версия) :

так уж получается, что у наследования и реализации интерфейса капитально разная семантика, хотя где-то там под капотом они идентичны. Наследование - «эта штука примерно такая же, как вон та штука, но с перламутровыми пуговицами». Интерфейс - «эта штука хз вообще говоря что за штука, но она умеет делать вот так».

мы обсуждаем не наследование vs интерфейс, а чистый абстрактный класс vs интерфейс. они оба наследуются, просто в с++ это называется наследование, а там где есть явное понятие интерфейса - есть более подходящее слово - implements, или вроде того.

то есть с точностью до имен это строго одно и то же.

какой нибудь на псевдокоде

interface Named {
  name(): string
}

на c++ это

class Named {
public:
  virtual string name() = 0;
}

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

в более казуистических случаях, когда создадут обьект класса потомка что метод реализовал, а потом преобразуют обьект к тому предку, что данный метод не реализовал, и вызовут name() - будет рантайм ошибка.

Исправление alysnix, :

так уж получается, что у наследования и реализации интерфейса капитально разная семантика, хотя где-то там под капотом они идентичны. Наследование - «эта штука примерно такая же, как вон та штука, но с перламутровыми пуговицами». Интерфейс - «эта штука хз вообще говоря что за штука, но она умеет делать вот так».

мы обсуждаем не наследование vs интерфейс, а чистый абстрактный класс vs интерфейс. они оба наследуются, просто в с++ это называется наследование, а там где есть явное понятие интерфейса - есть более подходящее слово - implements, или вроде того.

то есть с точностью до имен это строго одно и то же.

какой нибудь на псевдокоде

interface Named {
  name(): string
}

на c++ это

class Named {
public:
  virtual string name() = 0;
}

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

в более казуистических случаях, когда создадут обьект класса потомка что метод реализовал, а потом преобразуют обьект к тому предку, что данный метод не реализовал - будет рантайм ошибка.

Исходная версия alysnix, :

так уж получается, что у наследования и реализации интерфейса капитально разная семантика, хотя где-то там под капотом они идентичны. Наследование - «эта штука примерно такая же, как вон та штука, но с перламутровыми пуговицами». Интерфейс - «эта штука хз вообще говоря что за штука, но она умеет делать вот так».

мы обсуждаем не наследование vs интерфейс, а чистый абстрактный класс vs интерфейс. они оба наследуются, просто в с++ это называется наследование, а там где есть явное понятие интерфейса - есть более подходящее слово - implements, или вроде того.

то есть с точностью до имен это строго одно и то же.

какой нибудь на псевдокоде

interface Named {
  name(): string
}

на c++ это

class Named {
  virtual string name() = 0;
}

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

в более казуистических случаях, когда создадут обьект класса потомка что метод реализовал, а потом преобразуют обьект к тому предку, что данный метод не реализовал - будет рантайм ошибка.