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

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

Войти
Регистрация
Восстановить пароль
 
arhistratig13
25 / 18 / 2
Регистрация: 18.06.2013
Сообщений: 110
#1

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

16.07.2013, 22:41. Просмотров 424. Ответов 7
Метки нет (Все метки)

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 тоже абстрактным и как то это не хорошо, хотя можно.

Есть ли более красивое решение этой проблемы?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.07.2013, 22:41     Виртуальный метод
Посмотрите здесь:

Виртуальный метод - C++
Здравствуйте! Помогите, пожалуйста, найти ошибку в коде. #include "stdafx.h" class Person{ protected: char *name; ...

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

private наследование и виртуальный метод - C++
Привет! Тут хотел бы спросить такой вопрос. Есть базовый класс с виртуальным методом в protected секции. Я наследую этот класс как...

Вывести на экран виртуальный метод - C++
Как вывести на экран виртуальный метод?

Класс работник. Виртуальный метод - C++
Здраствуйте! Надо ввести работников с почасовой ЗП и фиксированной ЗП. Написать виртуальный метод для подсчета ЗП( для почасовиков -...

Виртуальный метод с параметром типа класс - C++
Наследую вектор от матрицы: class Matrix { public: ... virtual bool isValidToMult ( const Matrix & ) const; ... } А...

Вызвать виртуальный метод элемента вектора - C++
class Parent { public: Parent(); virtual void fn(); } class Child: public Parent { public

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Мимино
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
1890 / 1745 / 118
Регистрация: 25.03.2012
Сообщений: 5,924
Записей в блоге: 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++
Всем привет! Вопрос под кодом. #include &lt;cstdlib&gt; #include &lt;iostream&gt; using namespace std; class A ...

Абстрактный класс. Виртуальный метод, который возвращает T- тип - C++
Привет! Допустим, есть абстрактный класс, и метод, который возвращает T-тип. class A { public: template &lt;class T&gt; T*...

Абстрактный класс «Клиент банка», имеющий виртуальный метод для вывода данных о клиенте - C++
Создать абстрактный класс «Клиент банка», имеющий поля ФИО и адрес, а также метод, для вывода данные по клиенту. Дочерними классами...

Как создать виртуальный метод на С++ без использования слова "virtual"? - C++
ключевого слова &quot;virtual&quot;?

Виртуальный конструктор - C++
Подскажите, к каких случаях необходимо использовать виртуальный конструктор, и что это такое??


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

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

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