Переопределение функции в классах

0

Я смущен тем, как переопределять функции, если у меня есть

class  C
{
  public:
    C ();
};


class A: public C
{
  public:
    virtual string write()=0;
};

и я делаю еще один класс

class B: public A
{
    public:
       string B :: write() override {}
};

это недопустимо для класса B, наследующего класс A, и его переопределения?

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

void main()
{
   B();
}
  • 0
    У вас есть синтаксическая ошибка в определении класса B
  • 0
    да, я имел в виду поставить "public A", и я по ошибке поставил "class A", но эта синтаксическая ошибка не в моем коде, спасибо
Показать ещё 3 комментария
Теги:
class
override

3 ответа

0

это недопустимо для класса B, наследующего класс A, и его переопределения?

Вам нужно сбросить избыточные (и незаконные) B:: и вернуть что-то. В противном случае это нормально.

Мне не позволено называть конструкторы для этого абстрактного класса правильными? Но если этот абстрактный класс имеет конструктор, который он унаследовал, как я их называю?

Вы не можете напрямую ссылаться на конструкторы; это не то, как работает язык. Конструкторы называются косвенно при создании объекта:

B b;  // Create an instance of B, indirectly calling B::B(), which calls A::A()

Поскольку A является абстрактным, вы не можете создать объект этого типа; только таких производных типов, как B которые перекрывают все чистые виртуальные функции.

  • 0
    Но если производный класс (B) является производным от абстрактного класса (A), а абстрактный класс является производным от обычного класса (C), как я в основном вызываю конструкторы в C из B, потому что он должен иметь унаследовал конструктор от C, верно?
  • 0
    @ user2521432: Вы не вызываете конструктор. Он вызывается автоматически при создании объекта. B имеет неявный конструктор, который вызывает (неявный) конструктор A , который вызывает конструктор C Таким образом, создание объекта типа B правильно инициализирует его подобъект C своим конструктором.
0

Если вы хотите указать override (доступно на С++ 11) здесь, вы можете сделать это следующим образом.

Файл заголовка

class B : public A {
 public:
  virtual string Write() override;
}

CPP файл

string B::Write() {
// Your implementation here.
}

На самом деле, это хорошая практика, чтобы указать override когда это ваше фактическое намерение. Он избегает ошибки, такой как попытка переопределить string A::Write() со string B::Write() const, но получить результат определения второй функции. В этом случае, если вы укажете string B::Write() const override, это будет ошибка компиляции.

0

Синтаксис для наследования из другого класса должен выглядеть примерно так:

class B: public A{
   public:
      virtual string write(){
        //do something
        return someString;
      }
};
  • 0
    но как насчет переопределения метода, чтобы унаследованный класс не был абстрактным?
  • 0
    @ user2521432 там! см редактировать
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню