Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: полиморфизм аргументов фукнции  (Прочитано 6074 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Mayor
Специалист

ru
Offline Offline

« : 27-09-2009 05:39 » new

полиморфизм аргументов фукнции

допустим у меня в классе-интерфейсе A определена виртуальная функция принимающая и возвращающая ссылку или указатель на структуру a

можно ли в реализации интерфейса B, поменять тип аргументов функции или тип возвращаемого значения на b, унаследованный от a?

если да, то что произойдет, если через указатель типа A* на объект типа B передать ссылку на структуру b?

Записан

1n c0de we trust
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #1 : 27-09-2009 10:30 » 

Mayor, Это уже не полиморфизм, а переопределение функции. Следовательно у тебя будет работать метод родительского класса.
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
Mayor
Специалист

ru
Offline Offline

« Ответ #2 : 28-09-2009 10:42 » 

Mayor, Это уже не полиморфизм, а переопределение функции. Следовательно у тебя будет работать метод родительского класса.

мне не нужно переопределение функции:
под переопределением функции понимается выбор компилятором вызываемой функции в соответствии  с передаваемым аргументом

мне нужно, что-то типа виртуального конструктора:
функция которая будет менять тип аргументов и результатов в зависимости от того какому классу принадлежит объект ее содержащий:
struct B : public A {};

pa f=f_factory(string("B"));
//тип f->ff  B*(*pb::ff)(B*);
f=f_factory(string("A"));
//тип f->ff  A*(*pa::ff)(A*);
Записан

1n c0de we trust
Антон (LogRus)
Глобальный модератор

ru
Offline Offline
Пол: Мужской
Внимание! Люблю сахар в кубиках!


WWW
« Ответ #3 : 28-09-2009 10:47 » 

внутри напиши код
Код:
if(str = "A")
  return new A;
else
  return new B;

виртуальный конструктор Улыбаюсь бугага

лично я бы написал 2 отдельных метода, гибкость это круто, но лёгкость чтения кода - это величайшая ценность.
Записан

Странно всё это....
Mayor
Специалист

ru
Offline Offline

« Ответ #4 : 28-09-2009 12:59 » 

это то я уже 3 раза писал

меня интересует как внутри B, виртуальную функцию ff определить или если это невозможно объявить
при наличии в:
class a {
 virtual A* ff(A*);
};

...

Код:
#include <iostream>
using std::cin;
using std::cout;
using std::endl;
struct A {
char ca;
};
struct B : public A {
char cb;
};
B bb;
A aa;
class a {
public:
virtual A* ff(A*) { cout<<"a"<<endl; return &aa; }
};
class b : public a {
public:
//virtual B* ff(B*) { cout<<"b"<<endl; return &bb; }
virtual A* ff(A*) { cout<<"b"<<endl; return &aa; }
};
a* factory(char c ) {
if (c=='a') return new a();
return new b();
}
int main()
{
a* pa=factory('a');
pa->ff(&aa);
pa=factory('c');
pa->ff(&aa);
pa->ff(&bb);
cout<<"hello virtual arg"<<endl;
}

при virtual B* ff(B*) { cout<<"b"<<endl; return &bb; }
у меня 3 раза a:ff вызывается

...
Код:
class b : public a {
public:
virtual B* ff(A*) { cout<<"b"<<endl; return &bb; }
};

так вроде бы перебрал все доступные варианты, компилятор не дает ни в какую подменить аргументы функции ( вернее нае.. обманывает созданием еще 1й виртуальной функции ), единственное чего удалось достичь - это подменить тип возвращаемого значения, но я еще не проверил действительно ли возвращается B*, а не A*


« Последнее редактирование: 28-09-2009 13:39 от Mayor » Записан

1n c0de we trust
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines