Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Наследование от чисто абстрактного класса, undefined reference to vtable 
V
    Опции темы
Mechatronic
Дата 27.7.2013, 19:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 73
Регистрация: 28.3.2010

Репутация: нет
Всего: нет



Здравствуйте.
Имеется чисто абстрактный класс.
Заголовочник
Код

class Parser
{

public:
    virtual int appendByte(uint8_t data);
    virtual void clear();
    virtual ~Parser() = 0;
};

*.cpp файл
Код

Parser::~Parser()
{

}


От него наследуется конкретный класс
Код

class ChildParser : public Parser
{
public:
    ChildParser()
    {

    }

    virtual int appendByte(uint8_t data)
    {

    }

    virtual void clear()
    {

    }
};

Примитивный код для использования этого класса:
Код

int main()
{

    Parser * parser = new ChildParser;
    delete parser;
    return 0;
}

Чего я ожидал: При удалении объекта delete parser будет вызван дестрктор класса ChildParser , затем деструктор родителя Parser .
Не описывать реализации виртуального деструктора родителя нельзя, так как деструктор потомкапостарается вызвать его. Не использовать виртуальный деструктор тоже нельзя - иначе утечет память, выделенная для потомка.
Что вышло: При сборке выводится сообщение : undefined reference to `vtable for Parser'
Как я понял, это значит, что линковщик ищет реализацию виртуальных функций для родительского класса. Но по идее он должен быть чисто абстрактным
Что я сделал не так?

Это сообщение отредактировал(а) Mechatronic - 27.7.2013, 19:10
PM MAIL   Вверх
ChipNDale
Дата 28.7.2013, 08:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 37
Регистрация: 11.6.2010

Репутация: нет
Всего: 1



Видимо подразумевалось
Код

class Parser
{
public:
    virtual int appendByte(uint8_t data) = 0
    virtual void clear() = 0;
    virtual ~Parser();
};

PM MAIL   Вверх
Mechatronic
Дата 28.7.2013, 13:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 73
Регистрация: 28.3.2010

Репутация: нет
Всего: нет



Действительно, так собралось. Не могли бы вы вкратце объяснить для начинающего, в чем я не прав? Я же не инстанцирую родительский класс - зачем это шаманство с виртуальными функциями? Про деструктор ясно - он вызывается из потомка.
PM MAIL   Вверх
ChipNDale
Дата 29.7.2013, 03:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 37
Регистрация: 11.6.2010

Репутация: нет
Всего: 1



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

Другая ситуация в случае с кодом из первого поста: допустим, в классе-наследнике виртуальные функции не реализованы. В то же время в нем может не остаться чисто виртуальных функций. Как тогда создавать объекты такого класса?

Это сообщение отредактировал(а) ChipNDale - 29.7.2013, 03:05
PM MAIL   Вверх
Mechatronic
Дата 1.8.2013, 11:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 73
Регистрация: 28.3.2010

Репутация: нет
Всего: нет



Осознал. Спасибо!
PM MAIL   Вверх
bsa
Дата 1.8.2013, 11:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



Деструктор объекта тоже может быть "чисто виртуальным" (может пригодиться, когда наследование является обязательным условием, но абстрактный класс уже имеет достаточный функционал для самостоятельной работы). Но и в этом случае тело деструктора должно присутствовать:
Код
class MyClass
{
...
   virtual ~MyClass() = 0; //такой класс без наследования инстанцировать уже нельзя
...
};
...
MyClass::~MyClass()
{}

PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0460 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.