Как решить эту проблему наследования с помощью явной инициализации? - PullRequest
0 голосов
/ 03 августа 2020

Когда я создаю конструктор для дочернего класса, я получаю эту ошибку с помощью метода MyBook:

Конструктор для 'MyBook' должен явно инициализировать базовый класс 'Book', который не имеет конструктор по умолчанию clang (missing_default_ctor) Решение. cpp (8, 7): здесь объявлена ​​«книга»

Вот код ниже

#include <cmath>
#include <cstdio>
#include <vector>
#include <iostream>
#include <algorithm>
#include <string>
using namespace std;
class Book{
    protected:
        string title;
        string author;
    public:
        Book(string t,string a){
            title=t;
            author=a;
        }
        virtual void display()=0;

};

class MyBook : public Book
{
    protected:
    int price;
    string t;
    string a;

    public:
        MyBook(string t, string a, int p)
        {
            Book(t, a);
        }
};


int main() {
    string title,author;
    int price;
    getline(cin,title);
    getline(cin,author);
    cin>>price;
    MyBook novel(title,author,price);
    novel.display();
    return 0;
}

Ответы [ 3 ]

3 голосов
/ 03 августа 2020

При создании объекта базового класса вы должны сделать это перед вводом тела конструктора, что означает, что вам необходимо использовать список-инициализаторов-членов, например:

MyBook(string t, string a, int p) : Book(t, a) {}

Также обратите внимание, что в чтобы создать экземпляр объекта типа MyBook, вам необходимо переопределить виртуальный метод display в MyBook, например:

void display() override {};

Вот демонстрация .

1 голос
/ 03 августа 2020

Вы объявляете конструктор Book, который принимает параметры, которые неявно стирают конструктор по умолчанию Book. В производном классе MyBook ваш конструктор неявно вызывает конструктор по умолчанию Book, который удаляется, что приводит к ошибке.

Вы можете:

  • добавить конструктор по умолчанию в Book
  • вызвать специализированный конструктор Book в списке инициализации:
        MyBook(string t, string a, int p)
          : Book(t, a)
        {
        }
1 голос
/ 03 августа 2020
MyBook(string t, string a, int p)
{
    Book(t, a);
}

эквивалентно:

MyBook(string t, string a, int p) : Book() // Initialize base class with default constructor
{
    Book(t, a); // Construct a temporary Book, unrleated to the 
                // Book sub-object of this class.
}

, что объясняет ошибку компилятора. Вам нужно использовать:

MyBook(string t, string a, int p) : Book(t, a) // Initialize base class with the
                                               // constructor that accepts t and a
{
}
...