crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )


  Ответ в Наследник абстрактного класса не наследуется..
Введите ваше имя
Подтвердите код

Введите в поле код из 6 символов, отображенных в виде изображения. Если вы не можете прочитать код с изображения, нажмите на изображение для генерации нового кода.
 

Опции сообщения
 Включить смайлы?
Иконки сообщения
(Опционально)
                                
                                
  [ Без иконки ]
 


Последние 10 сообщений [ в обратном порядке ]
Iron Bug Дата 9.7.2013, 6:44
 
Цитата(Авварон @ 9.7.2013, 1:02) *
Валидный код:

хорошо. может. но в этом нет никакого смысла: получится обычная виртуальная функция, разве что потомок должен будет её переписывать явно. но это можно сделать просто через private-наследование, что будет гораздо логичнее.
Авварон Дата 8.7.2013, 22:02
 
Цитата(Алексей1153 @ 5.7.2013, 8:57) *
ты объявил чистый виртуальный деструктор
virtual ~Class1() = 0;

и тут же реализацию
Class1::~Class1(){}

понятно, что компилятор ругается

Цитата(Iron Bug @ 5.7.2013, 9:21) *
1. реализация НИКОГДА не должна быть в заголовочном файле. только в cpp.
2. у абстрактного метода (а также конструктора или деструктора) не может быть никакой реализации в принципе.



У абстрактного метода может быть реализация. Валидный код:

// .h
Class c
{
public:
    virtual void f() = 0;
}
// .cpp
void Class::f() {}
Алексей1153 Дата 8.7.2013, 9:42
  так ты его предоставь ))

class Class1
{
public:
    virtual ~Class1() {};
    ...
}
Berg Дата 5.7.2013, 20:48
  Всем спасибо за ответы!
Проблему решил (по крайней мере компилятор не ругается и все корректно работает) прописав реализацию в mainwindow.cpp.

Если убрать строку
Class1::~Class1(){}

компилятор ругается на строчку
~ExClass1(){}
так:
D:\MyProject-build-desktop-Qt_4_8_1_for_Desktop_-_MinGW__Qt_SDK_________\..\MyProject\\ExClass.h:37: ошибка: undefined reference to `Class1::~Class1(){}
D:\MyProject-build-desktop-Qt_4_8_1_for_Desktop_-_MinGW__Qt_SDK_________\..\MyProject\\ExClass.h:37: ошибка: undefined reference to `Class1::~Class1(){}
D:\MyProject-build-desktop-Qt_4_8_1_for_Desktop_-_MinGW__Qt_SDK_________\..\MyProject\\ExClass.h:37: ошибка: undefined reference to `Class1::~Class1(){}
D:\MyProject-build-desktop-Qt_4_8_1_for_Desktop_-_MinGW__Qt_SDK_________\..\MyProject\\ExClass.h:37: ошибка: undefined reference to `Class1::~Class1(){}
:-1: ошибка: collect2: ld returned 1 exit status
'

Когда гуглил решение проблемы, нашел фрагмент книги "Эффективное использование C++. 55 верных способов улучшить структуру и код ваших программ", автор Майерс Скотт
http://www.e-reading-lib.com/chapter.php/1...ovanie_CPP.html

Цитата
class AWOV { // AWOV = “Abstract w/o Virtuals”
public:
virtual ~AWOV() = 0; // объявление чисто виртуального
}; // деструктора

Этот класс включает в себя чисто виртуальную функцию, поэтому он абстрактный. А раз в нем объявлен виртуальный деструктор, то можно не беспокоиться о том, что деструкторы базовых классов не будут вызваны. Однако есть одна тонкость: вы должны предоставить определение чисто виртуального деструктора:

AWOV::~AWOV(){}; // определение чисто виртуального деструктора

Дело в том, что сначала всегда вызывается деструктор «самого производного» класса (то есть находящегося на нижней ступени иерархии наследования), а затем деструкторы каждого базового класса. Компилятор сгенерирует вызов ~AWOV из деструкторов производных от него классов, а значит, вы должны позаботиться о его реализации. Если этого не сделать, компоновщик будет недоволен.
Алексей1153 Дата 5.7.2013, 9:22
  Berg, убери вообще строку
Class1::~Class1(){}

а после закрывающей фигурной скобки класса поставь ;
Iron Bug Дата 5.7.2013, 9:21
  1. реализация НИКОГДА не должна быть в заголовочном файле. только в cpp.
2. у абстрактного метода (а также конструктора или деструктора) не может быть никакой реализации в принципе.
Berg Дата 5.7.2013, 9:14
  Забыл, когда писал сообщение
#include "Class.h"
class ExClass1 : public Class1
{...

Ошибка выскакивает на стоке
Class1::~Class1(){}


Я ведь определил деструктор за пределами класса. Или определять надо в другом файле?

Если добавить реализацию деструктора в файл ExClass.h, то те же ошибки на строке
Class1::~Class1(){}
Алексей1153 Дата 5.7.2013, 8:57
  ты объявил чистый виртуальный деструктор
virtual ~Class1() = 0;

и тут же реализацию
Class1::~Class1(){}

понятно, что компилятор ругается
Litkevich Yuriy Дата 5.7.2013, 4:24
 
Цитата(Berg @ 5.7.2013, 2:46) *
Class.h:29: ошибка: first defined here
и где эта строка, почему не показываешь соответствующее место в коде?


Цитата(Berg @ 5.7.2013, 2:46) *
class ExClass1 : Class1
почему не указан тип наследования (public, private, ...)?
Berg Дата 5.7.2013, 0:46
  Всем привет! Помогите решить проблему. Есть абстрактный класс,от которого наследуется потомок. Никак не могу разобраться с деструкторами

Class.h
class Class1
{
public:
    virtual ~Class1() = 0;
    virtual void started() = 0;
}

Class1::~Class1(){}


ExClass.h
#include "Class.h"
class ExClass1 : Class1
{
public:
    void started()
    {
        qDebug () << "Ex started";
    }
    ~ExClass1(){}
};


Вызов started()
mainwindow.cpp
ExClass ExCl;
ExCl.started();


Компилятор ругается
D:\MyProject-build-desktop-Qt_4_8_1_for_Desktop_-_MinGW__Qt_SDK_________\..\MyProject\\Class.h:29: ошибка: first defined here
D:\MyProject-build-desktop-Qt_4_8_1_for_Desktop_-_MinGW__Qt_SDK_________\debug\mainwindow.o:-1: In function `~Class1':
D:\MyProject-build-desktop-Qt_4_8_1_for_Desktop_-_MinGW__Qt_SDK_________\..\MyProject\\Class.h:29: multiple definition of Class1::~Class1()'

Заранее спасибо за ответы.
Просмотр темы полностью (откроется в новом окне)
RSS Текстовая версия Сейчас: 27.4.2024, 12:34