Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.70
John Paramol
0 / 0 / 0
Регистрация: 14.05.2008
Сообщений: 19
#1

Проблема с виртуальными функциями - C++

02.07.2008, 16:06. Просмотров 1247. Ответов 6
Метки нет (Все метки)

Привет.
Столкнулся с небольшой проблемой, касательно виртуальных функций.
Стыдно спрашивать, ибо это нечто элементарное.
Просто я уже успел подзабыть основы ООП в C++.
Вот пример.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
#include <stdio.h>
class A
{
  public:
    void Func()
    {
      VirtFunc();
    }
    ~A()
    {
      Destroy();
    }
    virtual void VirtFunc()
    {
      puts("A::VirtFunc() called");
    }
    virtual void Destroy()
    {
      puts("A::Destroy() called");
    }
};
class B : public A
{
  public:
    virtual void VirtFunc()
    {
      puts("B::VirtFunc() called");
    }
    virtual void Destroy()
    {
      puts("B::Destroy() called");
    }
};
int main()
{
  {
    B BObject;
    BObject.Func();
  }
  getchar();
  return 0;
}
В методе Func вызывается виртуальная функция VirtFunc из наследника - так и надо.
Но в деструкторе наследника почему-то вызывается виртуальная функция Destroy из родителя.
Мне нужно при разрушении наследника вызвать Destroy наследника.
Где я туплю?
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.07.2008, 16:06
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Проблема с виртуальными функциями (C++):

РАБОТА С ВИРТУАЛЬНЫМИ ФУНКЦИЯМИ - C++
Доброго времени суток, форумчани! Помогите мне, пожалуйста, с задачей, у меня просто нет этой темы, а сдать нужно обязательно :( ...

Задачка с наследованием и виртуальными функциями - C++
Диаграмма классов на приложенном рисунке. #include &lt;iostream&gt; class IData { public: virtual ~IData() = 0 {} virtual...

Классы с виртуальными функциями. Class Student - C++
Создать класс Студент со свойствами: ФИО, Факультет, Курс, минималь- ная оценка по экзаменам за последнюю сессию (по 5-ти бальной...

Неправильный вывод при работе с виртуальными функциями - C++
В общем, учу плюсы по книге Праты. Там есть одно задание по виртуальным функциям. Но дело сейчас не в них. У меня есть базовый (Cd) и...

Создать абстрактный базовый класс с виртуальными функциями - площадь и периметр - C++
Помогите написать,не врублюсь как писать много пропустил (( Задание:Создать абстрактный базовый класс с виртуальными функциями - площадь ...

Создать базовый класс список. Реализовать на базе списка стек и очередь с виртуальными функциями вставки и вытаскивания - C++
Здравствуйте, помогите пожалуйста разобраться что как работает в программе (напишите комментарии). Задание: Создать базовый класс...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Lord_Voodoo
Супер-модератор
8589 / 2189 / 61
Регистрация: 07.03.2007
Сообщений: 10,890
Завершенные тесты: 1
02.07.2008, 16:28 #2
по идее, тебе надо переопределить деструктор для наследника, в противном случае он наследует деструктор родителя, поэтому его и вызывает...
0
John Paramol
0 / 0 / 0
Регистрация: 14.05.2008
Сообщений: 19
02.07.2008, 16:35  [ТС] #3
Ну так в деструкторе родителя вызывается Destroy, а он - виртуальный. По идее должен быть вызван B:estroy(), но вызывается A:estroy()...
0
Lord_Voodoo
Супер-модератор
8589 / 2189 / 61
Регистрация: 07.03.2007
Сообщений: 10,890
Завершенные тесты: 1
02.07.2008, 16:40 #4
нет, как раз таки вызывается родительский деструктор, потому что для наследника не определен деструктор, поэтому и перемещаешься по иерархии вверх... хотя глянул твой код, он все равно по иерархии вверх идет, даже с объявленным конструктором...
в билдеровском хелпе написано, что оно так и должно быть, обращение к деструкторам идет до базового класса...
Код
#include <iostream>
class color {
public:
   virtual ~color() {  // Virtual destructor
      std::cout << "color dtor\n";
      }
};
class red : public color {
public:
   ~red() {  // This destructor is also virtual
      std::cout << "red dtor\n";
      }
};
class brightred : public red {
public:
   ~brightred() {  // This destructor is also virtual
       std::cout << "brightred dtor\n";
       }
};
int main() {
   color *palette[3];
   palette[0] = new red;
   palette[1] = new brightred;
   palette[2] = new color;
   // The destructors for red and color are called.
   delete palette[0];
   std::cout << std::endl;
   // The destructors for bright red, red, and color are called.
   delete palette[1];
   std::cout << std::endl;
   // The destructor for color is called.
   delete palette[2];
   return 0;
}
Program Output:
red dtor
color dtor
brightred dtor
red dtor
color dtor

color dtor
в codeblock та же ситуация:
Код
#include <stdio.h>
class A
{
    private:
    virtual void Destroy()
    {
      puts("A::Destroy() called");
    }
    public:
    virtual void Func()
    {
      VirtFunc();
    }
    ~A()
    {
      Destroy();
    }
    virtual void VirtFunc()
    {
      puts("A::VirtFunc() called");
    }
};
class B : public A
{
  public:
    ~B()
    {
        Destroy();
    }
    virtual void Func()
    {
      puts("B::VirtFunc() called");
    }
    virtual void Destroy()
    {
      puts("B::Destroy() called");
    }
};
class C : public B
{
  public:
    ~C()
    {
        Destroy(0);
    }
    virtual void Func()
    {
      puts("C::VirtFunc() called");
    }
    void Destroy(int i)
    {
      puts("C::Destroy() called");
    }
};
int main()
{
  {
    C BObject;
    BObject.Func();
  }
  getchar();
  return 0;
}
0
John Paramol
0 / 0 / 0
Регистрация: 14.05.2008
Сообщений: 19
02.07.2008, 17:41  [ТС] #5
Пожалуйста, читайте повнимательнее.
Это понятно, что деструктор вызывается родительский, т.к. он наследуется. Но в нем вызывается метод Destroy(), а он - виртуальный, и поэтому должен быть вызван Destroy() наследника, а не родителя.
Но выходит наоборот:(
0
Lord_Voodoo
Супер-модератор
8589 / 2189 / 61
Регистрация: 07.03.2007
Сообщений: 10,890
Завершенные тесты: 1
02.07.2008, 17:44 #6
а с чего вы взяли, что деструкторе класса А будет вызываться функция наследника - класса В?
разве наследствие идет не нисходящее? а если вызывается деструктор класса А, то соответственно и функция класса А...
0
John Paramol
0 / 0 / 0
Регистрация: 14.05.2008
Сообщений: 19
03.07.2008, 08:55  [ТС] #7
Цитата Сообщение от WooDooMan666 Посмотреть сообщение
а с чего вы взяли, что деструкторе класса А будет вызываться функция наследника - класса В?
фффф... с того, что она виртуальная.
В общем, мне уже подсказали ответ: в конструкторах/деструкторах виртуальные функции ведут себя как обычные.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.07.2008, 08:55
Привет! Вот еще темы с ответами:

Создать абстрактный базовый класс Тройка чисел с виртуальными методами увеличения на 1. Создать производный класс Время со своими функциями - C++
Здравствуйте, пожалуйста помогите написать код к данной задаче, с таким условием: Создать абстрактный базовый класс Тройка чисел с...

проблема со структурой и функциями - C++
Задание: 1. Описать структуру с именем ZNAK, содержащую следующие поля: • фамилия, имя; • знак Зодиака; • день рождения (массив из...

OpenGL, проблема с функциями. - C++
Проблема состоит в том, что если я пытаюсь перенести параметры создания окна в OpenGL в функцию то окно не создается, а если в майн то все...

Удаление узла бинарного дерева, проблема с функциями, адресацией - C++
код: #include &lt;cstdlib&gt; #include &lt;iostream&gt; typedef struct tree{ // обьявляем тип char data; //дата изьятия в формате xx.xx.xxxx ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
03.07.2008, 08:55
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru