Может ли абстрактный класс иметь конструктор и частный член в С++ 11

Подобные вопросы задают, но они не дают ответа на мой вопрос. Я пытаюсь создать абстрактный класс (с одной чистой виртуальной функцией). Но компилятор выдает эту ошибку:

src/library.cpp:11:24: ошибка: недопустимое приведение к типу абстрактного класса ‘mgc::Shapes’ Shapes (длина, имя);

У меня есть конструктор абстрактного класса, так как он имеет переменные-члены и функции-члены. Я понятия не имею, почему эта ошибка появляется.

Вот мой заголовочный файл librar.h

class Shapes
{
public:
    Shapes(double len = 0.0, std::string name = "");
    virtual void printClass();
    virtual double area() = 0;
protected:
    double len_, width_;
    std::string name_;
};

class Triangle : public Shapes
{
public:
    Triangle(double lene =0, std::string namee= "" );
    void printClass();
    double area();
};

Вот мой файл реализации library.cpp

mgc::Shapes::Shapes(double length, std::string name)
: len_(length),
 width_(length),
name_(name)
{}

mgc::Triangle::Triangle(double length, std::string name)
{
    Shapes(length, name);
}

void mgc::Shapes::printClass()
{
    std::cout<<"Base class is called"<<std::endl;
}

void mgc::Triangle::printClass()
{
    std::cout<<"Triangle class is called"<<std::endl;
}

double mgc::Triangle::area()
{
    return(width_*len_);
}

person TonyParker    schedule 24.03.2018    source источник
comment
Сделайте минимальный воспроизводимый пример, например это, но короче, без абстрагирования ненужного мусора. Это необязательно.   -  person Lightness Races in Orbit    schedule 24.03.2018


Ответы (2)


Triangle должен вызывать конструктор базового класса внутри списка инициализации:

mgc::Triangle::Triangle(double length, std::string name)
:   Shapes(length, name)
{
}
person user7860670    schedule 24.03.2018

Это неправильный способ вызова базового конструктора:

mgc::Triangle::Triangle(double length, std::string name)
{
    Shapes(length, name);
}

Все, что вы сделали, это попытались создать безымянный временный тип Shapes, что невозможно, потому что Shapes чисто виртуальный ("абстрактный").

Используйте список инициализации элементов, когда вы хотите инициализировать базы и элементы:

mgc::Triangle::Triangle(double length, std::string name)
   : Shapes(length, name)
{}

Это должно быть объяснено в вашей книге.

person Lightness Races in Orbit    schedule 24.03.2018