Наследование абстрактного класса в C++

539
26 ноября 2016, 18:54

Изучаю тему наследования по практикуму учебника 2010 года. Там есть пример, который я взял для изучения вопроса наследования, где используется базовый абстрактный класс. Я создавал объект от абстрактного для унаследованного класса (поправьте если не прав) и у меня ничего не получается, компилятор упорно стоит на том что есть ошибки.

Базовый класс AString.h

#pragma once
#ifndef ASTRING_H
#define ASTRING_H
#include<string>
class AString
{
    public:
    virtual ~AString() {}
    virtual const std::string& GetName() = 0;
    virtual const std::string& GetVal()const = 0;
    virtual int GetSize()const = 0;
};

Унаследованный SymbString.h

#pragma once
#include <string>
#include "AString.h"
class SymbString :public AString 
{
    public:
    SymbString(std::string _name) :name(_name) {}
    SymbString(std::string _name, std::string _val) :name(_name), val(_val) {}
    const std::string& GetName()const { return name; }
    const std::string& GetVal()const { return val; }
    int GetSize()const { return val.size(); }
private:
    std::string name, val;
};

И файл где можно создавать объектов столько, сколько хочет пользователь:

....
AString* pNewObj;
switch (item)
{
case 1: pNewObj = new SymbString(name, value);// тут подчеркивает и пишет "использование 
//объекта абстрактного типа класса "SymbString" не допускается чисто
 //виртуальная функция функцию "AString::GetName" не имеет оператора переопределения " 
    break;
case 2: if (!IsHexStrVal(value))
{
    cout << "Error!" << endl;
    return;
}
        pNewObj = new HexString(name, value);// выводит тоже самое только для этого случая
        break;
}

То что написал компилятор ("использование объекта абстрактного типа класса "SymbString" не допускается чисто виртуальная функция функцию "AString::GetName" не имеет оператора переопределения") вызывает непонимание что от меня хотят. Разве для SymbString и HexString я не могу создавать объекты?

Переписывал с учебника код слово в слово.

Answer 1

Вы определяете новую версию GetName() const (константную), а не переопределяете абстрактную GetName()

READ ALSO
Как в Linux создавать сокеты на С++ с STCP?

Как в Linux создавать сокеты на С++ с STCP?

Делаю всё по книге "Создание сетевых приложений в среде Linux: Руководство разработчика"Не компилируется

373
Разбиение чисел на простые множители

Разбиение чисел на простые множители

Как быстро разбить числа до 10ˆ18 на простые множители?

314
Умножение в столбик C++

Умножение в столбик C++

Пытаюсь реализовать умножение строковых чисел стобикомНа вход подается два числа, записанные в string

352
QLabel разного размера в QScrollArea

QLabel разного размера в QScrollArea

Делаю вывод текста в QLabel из базы данныхВ разных случаях текста может быть много, а может вообще не быть

289