powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Полиморфизм с++
7 сообщений из 7, страница 1 из 1
Полиморфизм с++
    #38315135
moongloom
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: plaintext
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.
#include <iostream>

class c1
{
public:
    virtual char* name() {
        return "c1";
    }
};

class c2: public c1
{
public:
    char* name() {
        return "c2";
    }
};

void sm(c1 c) {
    printf(c.name());
}

int main() {
    c2 c;
    sm(c);
    return 0;
}



Запускаю это, в консоли печатает "с1", хотя в функцию фактически пришел объект класса с2. Это нормальное поведение программы или я где-то чего-то забыл указать? Я недавно изучаю С++, до этого работал в delphi, и там в аналогичном коде вызывается метод того класса, который пришел в sm, а не того, который указан типом параметра.
...
Рейтинг: 0 / 0
Полиморфизм с++
    #38315141
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
moongloom, функция должна принимать входной параметр по ссылке, или по указателю, а не по значению.
...
Рейтинг: 0 / 0
Полиморфизм с++
    #38315158
moongloom
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Неожиданно) спасибо, заработало. Теперь, не отходя от кассы, еще вопрос :) как аналогично заставить работать вот это?
Код: plaintext
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.
#include <iostream>
#include <typeinfo>

class c1
{
public:
    char* name() {
        return (char*)typeid(this).name();
    }
};

class c2: public c1
{

};

void sm(c1* c) {
    printf(c->name());
}

int main() {
    c2 c;
    sm(&c);
    return 0;
}
...
Рейтинг: 0 / 0
Полиморфизм с++
    #38315166
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
moongloomкак аналогично заставить работать вот это?
Добавь в с1 хоть что-нибудь виртуальное.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Полиморфизм с++
    #38315169
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
moongloom,
Чтобы typeid показывал тип динамически , нужно чтобы во-первых тип был полиморфным (предок имеет виртуальные функции)
Во-вторых в typeid надо передавать ссылку, а не указатель.
Код: plaintext
1.
typeid(*this)
...
Рейтинг: 0 / 0
Полиморфизм с++
    #38315171
moongloom
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakovmoongloomкак аналогично заставить работать вот это?
Добавь в с1 хоть что-нибудь виртуальное.
если сделать вот так
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
class c1
{
public:
    virtual char* name() {
        return (char*)typeid(this).name();
    }
};

это не даст результата, выводится название типа родительского класса, т.е. c1. Я хочу сделать так, чтобы код метода name() класса c1 был выполнен для с2, в этом случае должно быть выведено имя типа с2.
...
Рейтинг: 0 / 0
Полиморфизм с++
    #38315172
moongloom
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
авторtypeid(*this)Вот так заработало. Большое спасибо всем!
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / Полиморфизм с++
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]