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

Виртуальный метод - C++

Восстановить пароль Регистрация
 
arhistratig13
25 / 18 / 2
Регистрация: 18.06.2013
Сообщений: 110
16.07.2013, 22:41     Виртуальный метод #1
C++
1
2
3
4
class A
{
    virtual void Print()=0;
}
C++
1
2
3
4
5
6
7
class B : public A
{
    virtual void Print()
    {
            //Печатаем в консоли
    }
}
C++
1
2
3
4
5
6
7
class C : public B
{
    void Print()
    {
            //Печатаем в окно PictureBox
    }
}
Как перегрузить функцию Print в классе C, чтобы она не была виртуальной. Типа пишу класс, отлаживаю его в консоли, для этого печать в консоли, потом наследую от него класс и перегружаю функцию печать, которая уже способна печатать мои данные не в консоль а в окно!

Знаю можно забить и просто назвать одну функцию Print для консоли, другую Show для окна, но получается нелогичный процесс разработки, так как в A классе есть Print, потом реализуя Show надо вернуться в класс А и B прописать там Show, так мы сделаем класс B тоже абстрактным и как то это не хорошо, хотя можно.

Есть ли более красивое решение этой проблемы?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Мимино
 Аватар для Мимино
180 / 151 / 5
Регистрация: 22.05.2013
Сообщений: 435
Записей в блоге: 1
16.07.2013, 22:51     Виртуальный метод #2
На сколько я знаю, если функция была объявлена виртуальной в базовом классе, то она будет виртуальной во всех производных классах, даже если это не указать явно.

Добавлено через 2 минуты
А зачем ее делать не виртуальной? Вы можете сделать реализацию этого метода для класса C какую угодно.
arhistratig13
25 / 18 / 2
Регистрация: 18.06.2013
Сообщений: 110
16.07.2013, 22:53  [ТС]     Виртуальный метод #3
Мимино, Да, так в этом и проблема ищу какой то хитрый путь обмануть...
по идее то все логично, как компилятору определить какой из Print нужно использывать, поэтому они все и виртуальные, но может есть способ обходиться указанием: что если функция дальше в классе C существует, то напрямую использывать ее обходя Print из B мимо...
Мимино
 Аватар для Мимино
180 / 151 / 5
Регистрация: 22.05.2013
Сообщений: 435
Записей в блоге: 1
16.07.2013, 22:56     Виртуальный метод #4
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
class A
{
    virtual void Print()=0;
};
 
class B : public A
{
    virtual void Print()
    {
            cout << "Печатаем что-то";
    }
};
 
class C : public B
{
    virtual void Print()
    {
            cout << "Би-би-би\a\a\a";
    }
};
 
int main()
{
   A *a;
   B b;
   C c;
   a = &c;
   a->Print();
   return 0;
}
Результат:
Би-би-би[alarm]
Полиморфизм чистой воды.
arhistratig13
25 / 18 / 2
Регистрация: 18.06.2013
Сообщений: 110
16.07.2013, 22:58  [ТС]     Виртуальный метод #5
Цитата Сообщение от Мимино Посмотреть сообщение
На сколько я знаю, если функция была объявлена виртуальной в базовом классе, то она будет виртуальной во всех производных классах, даже если это не указать явно.

Добавлено через 2 минуты
А зачем ее делать не виртуальной? Вы можете сделать реализацию этого метода для класса C какую угодно.
То есть, она не будет подхватывать перед исполнением функцию из B, а будет только реализация из C ?

Добавлено через 1 минуту
Мимино, Блин клево, че то я тупанул))) что то в голове из-за виртуального деструктора не то сложилось!
Мимино
 Аватар для Мимино
180 / 151 / 5
Регистрация: 22.05.2013
Сообщений: 435
Записей в блоге: 1
16.07.2013, 22:59     Виртуальный метод #6
Цитата Сообщение от arhistratig13 Посмотреть сообщение
что если функция дальше в классе C существует, то напрямую использывать ее обходя Print из B мимо...
Если Вы переопределите этот виртуальный метод в классе С, то при вызове этого метода через объект класса С или через указатель базового класса(как в примере), то будет вызван именно экземпляр метода класса С(обходя В, если угодно).
Kuzia domovenok
 Аватар для Kuzia domovenok
1883 / 1738 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
16.07.2013, 23:02     Виртуальный метод #7
Цитата Сообщение от arhistratig13 Посмотреть сообщение
То есть, она не будет подхватывать перед исполнением функцию из B, а будет только реализация из C ?
А она и не должна. Такого чуда вообще не бывает, чтобы по цепочке вызывались перегруженные функции. (Единственное отдалённо напоминающее то, о чём ты говоришь, исключение - конструирование объекта, но там это логично. Каждая унаследованная часть объекта конструируется своим конструктором)
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.07.2013, 23:05     Виртуальный метод
Еще ссылки по теме:

C++ Виртуальный метод
Разобрать код, в котором реализован виртуальный метод C++
C++ Абстрактный класс. Виртуальный метод, который возвращает T- тип

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

Или воспользуйтесь поиском по форуму:
arhistratig13
25 / 18 / 2
Регистрация: 18.06.2013
Сообщений: 110
16.07.2013, 23:05  [ТС]     Виртуальный метод #8
Kuzia domovenok, Да именно из-за деструктора так и подумал...
Yandex
Объявления
16.07.2013, 23:05     Виртуальный метод
Ответ Создать тему
Опции темы

Текущее время: 00:05. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru