2015-06-28 5 views
-1

У меня есть упражнение дело с классами в C++, в котором я создаю файловую систему, как так (File.h)Реализация виртуальных функций в сфере наследования

class File { 
    public: 
    virtual string getName(); 
    virtual void print() const=0; 
    virtual bool operator==(const File& file) const=0; 
} 

Тогда я реализую getName в File.cpp и создать TextFile.h

class TextFile : public File { 
    public: 
    void print() const; 
    void operator==(const TextFile& textFile) const; 

    private: 
    string text_; 

Реализовать в TextFile.cpp

void TextFile :: print() const { 
    cout << text_ << endl; 
} 

bool TextFile :: operator==(const TextFile& textFile) const { 
    return true; //just for compiling 
} 

при компиляции мы получаем:

$ g++ -Wall -g File.cpp TextFile.cpp -o RunMe 
TextFile.cpp: In function ‘int main()’: 
TextFile.cpp:8:11: error: cannot declare variable ‘Ilan’ to be of abstract type ‘TextFile’ 
    TextFile Ilan("Ilan", NULL, "Blah \n NewLine"); 
     ^
In file included from TextFile.cpp:1:0: 
TextFile.h:8:7: note: because the following virtual functions are pure within ‘TextFile’: 
class TextFile: public File 
    ^
In file included from TextFile.h:4:0, 
       from TextFile.cpp:1: 
File.h:57:18: note:  virtual bool File::operator==(const File&) const 
    virtual bool operator==(const File& file) const = 0; 

я, вероятно, не знаю, как хорошо работать с наследованием и операторскими функциями (видящий функция print работает хорошо), но я не могу найти проблему при просмотре мой материал курса.

+0

Не ясно ли сообщение об ошибке? Вы должны реализовать 'operator == (const File & file) const', а не' operator == (const TextFile & file) const'. –

+0

Возможный дубликат [оператор виртуального присваивания C++] (http://stackoverflow.com/questions/669818/virtual-assignment-operator-c) –

+0

Я рассмотрел этот вопрос. Не удалось решить мою проблему ... –

ответ

1

ПЕРЕГРУЗКА против ПЕРЕОПРЕДЕЛЕНИЯ ...

В File объявление виртуальной функции

bool operator==(const File & file) const 

как чистая. (= 0). Итак, File - это абстрактный класс, а также его подклассы, где он не переопределяется.

В TextFile, вы перегрузки его функции с тем же именем (operator==)

bool operator==(const TextFile & textFile) const 

но вы не переопределение его, так как параметры не тот же тип. Следовательно TextFile является абстрактным классом, потому что

bool TextFile::operator==(const File & file) const 

до сих пор не определен.

EDIT: компилятор может обнаружить такие проблемы, если вы используете ключевое слово C++ 11 «override». В TextFile.h:

class TextFile : public File 
{ 
    ... 
    void print()   const override; 
    bool operator== (.....) const override; 
    ... 
} 

сообщение покажет, если функции фактически не отменяют, когда они должны делать.

+0

Итак, как мне его скомпилировать? Я хочу, чтобы функция работала только для класса TextFile. Спасибо –

+0

Не могли бы вы уточнить? Что вы подразумеваете под «работать только для TextFile»? Если да, зачем объявлять его в Файле как виртуальную функцию? –

+0

Честно говоря, там объявлено, что я получил «File.h», и меня попросили не менять его. Я могу реализовать его на «File.cpp», но было бы бессмысленно, чтобы он сравнивал поле 'string text_', которое находится только в' TextFile' –

0

Линия

bool operator==(const &TextFile textFile) const { 

неверен - должно быть

bool TextFile::operator==(const TextFile& textFile) const { 

Как должно быть определено.

+0

Весь код состоит из опечаток, разве вы не видите 'const & TextFile'? Очевидно, это не настоящий код. –

+0

Да, это была ошибка копирования, у нее есть 'TextFile ::' в моем .cpp –

+0

@ AntonSavin- Правильно - я был в процессе редактирования –

1

Компилятор сообщает вам, что он не может объявить Ilan типом «Textfile», потому что «виртуальная функция чиста», а затем дает вам имя чистой виртуальной функции.

В C++ чистая виртуальная функция - это та, которая была объявлена ​​виртуальной и для которой не определена реализация.Если класс имеет любые виртуальные функции, это виртуальный класс, и вы не можете создать экземпляр этого класса. Это полезно для создания абстрактных интерфейсов, что и было сделано с вашим родительским классом.

В вашем случае вы указали, что оператор == является оператором класса в объявлении TextFile, но вы определили оператор == в глобальном пространстве имен. Чтобы исправить это, вы можете либо объявить оператор == в глобальном пространстве имен, или определить его как часть TextFile (в ред Излечить предложил), но вы должны отдавать предпочтение бывшим по причинам, изложенным здесь: Operator overloading : member function vs. non-member function?

+0

Спасибо за информацию, я использовал ответ Майкла Биллоу, и он отлично работает, но позже я буду читать вашу ссылку, он выглядит хорошо для лучшего понимания –

0

file.h

class File { 
    public: 
    virtual string getName() const=0; 
    virtual void print() const=0; 
}; 

TextFile.h

class TextFile : public File { 
    public: 
    string getName() const; 
    void print() const; 
    bool operator==(const TextFile& textFile) const; 

    private: 
    string text_; 
}; 

TextFile.cpp

string TextFile ::getName() const{ 
    return text_; 
} 
void TextFile :: print() const { 
    cout << text_ << endl; 
} 

bool TextFile :: operator==(const TextFile& textFile) const { 
    return text_==textFile.text_; 
} 
Смежные вопросы