Logo Море(!) аналитической информации!
IT-консалтинг Software Engineering Программирование СУБД Безопасность Internet Сети Операционные системы Hardware
Архив форумов ЦИТФорума
Море(!) вопросов - Море(!) ответов
 
 FAQFAQ   ПоискПоиск   ПользователиПользователи   ГруппыГруппы   РегистрацияРегистрация 
 ПрофильПрофиль   Войти и проверить личные сообщенияВойти и проверить личные сообщения   ВходВход 
Как правильно задавать вопросы

Тупее вопрос вы врядли вобще найдете

 
Перейти:  
Этот форум закрыт, вы не можете писать новые сообщения и редактировать старые.   Эта тема закрыта, вы не можете писать ответы и редактировать сообщения.    Список форумов Архив форумов ЦИТФорума -> Программирование
Предыдущая тема :: Следующая тема  
Автор Сообщение
tinimi



Зарегистрирован: 27.03.2005
Сообщения: 90
Откуда: Win32

СообщениеДобавлено: Вс Мар 27 2005 13:29    Заголовок сообщения: Тупее вопрос вы врядли вобще найдете Ответить с цитатой

тупейший вопрос.
Нужен пример(чисто код и все, в коде я разберусь).
есть 2 класа, один наследник другого, при етом надо что б в наследнике происходила перегрузка поля(не метода). Всмысле менялся тип. ну типа в родителе int a, а в наследнике уже double a. Приведите плс пример кода.
_________________
[ TiNiMi ]
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
droopy



Зарегистрирован: 28.07.2004
Сообщения: 168

СообщениеДобавлено: Вс Мар 27 2005 15:36    Заголовок сообщения: Ответить с цитатой

Код:

#include <iostream>

struct A
{
    int a;
};

struct B : public A
{
    double a;
    B( double aa ) : A()
    {
        a = aa;
    }
};

main()
{
    B o( 1.2 );
    std::cout << o.a;
}

а самому что лень?
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail Посетить сайт автора
tinimi



Зарегистрирован: 27.03.2005
Сообщения: 90
Откуда: Win32

СообщениеДобавлено: Вс Мар 27 2005 16:27    Заголовок сообщения: спасибо Ответить с цитатой

Вообще то нет, просто я С++ только начинаю учить.
По тому что привел droopy:
Воопервых надо class а не struct, но ето пол беды
Основное - надо сделать что бы не перекрывались(!) имена. В данном случае посто перекрываются имена, а мне надо что бы в наследнике небыло(!) того int a, а был сразу double a грубо говоря, что бы ето заменялось. А в данном примере вроде просто у нас 2 поля. Ну и естестно надо что б все с class
_________________
[ TiNiMi ]
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
droopy



Зарегистрирован: 28.07.2004
Сообщения: 168

СообщениеДобавлено: Вс Мар 27 2005 18:40    Заголовок сообщения: Ответить с цитатой

ну с класс это ты сам переводи. это плевое дело.
а переменные как раз заменяются, (int a) в новом классе не будет,
если я ошибаюсь ты меня опровергни.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail Посетить сайт автора
tinimi



Зарегистрирован: 27.03.2005
Сообщения: 90
Откуда: Win32

СообщениеДобавлено: Вс Мар 27 2005 18:48    Заголовок сообщения: Ответить с цитатой

droopy писал(а):
ну с класс это ты сам переводи. это плевое дело.
а переменные как раз заменяются, (int a) в новом классе не будет,
если я ошибаюсь ты меня опровергни.

Вот кусок кода, показывает что не заменяется, а перекрывается:
Код:

#include <iostream>
struct A
{
    int a;
};

struct B : public A
{
    double a;
    B( double aa ) : A()
    {
        a = aa;
        A::a=3;
    }
    void prn();
};

void B::prn(){
   std::cout<<A::a;
};

main()
{
    B o( 1.2 );
    std::cout << o.a<<"\n";
    o.prn();
   
}


_________________
[ TiNiMi ]
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
tinimi



Зарегистрирован: 27.03.2005
Сообщения: 90
Откуда: Win32

СообщениеДобавлено: Вс Мар 27 2005 18:55    Заголовок сообщения: Ответить с цитатой

На екран выведет:
Код:
1.2
3

А мне надо что б int a уже небыло.
Была идея описывать как void* a;, а в конструкторе уже выделять память и задавать тип. (Конструктор ненаследуется). Но сказали что не так надо делать. Может есть чтото типа virtual там или как?
_________________
[ TiNiMi ]
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
droopy



Зарегистрирован: 28.07.2004
Сообщения: 168

СообщениеДобавлено: Вс Мар 27 2005 19:50    Заголовок сообщения: Ответить с цитатой

я не знаю чтоб поля можно было определять как virtual.
имхо это для функций.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail Посетить сайт автора
dilmah



Зарегистрирован: 31.10.2004
Сообщения: 13

СообщениеДобавлено: Вс Мар 27 2005 20:52    Заголовок сообщения: Ответить с цитатой

> а переменные как раз заменяются, (int a) в новом классе не будет, если я ошибаюсь ты меня опровергни.

Наследование в С++ это _расширение_ структуры. Поле исчезнуть не может, и тип
его поменяться не может. Может только добавиться, возможно перекрывая имя.
С++ на нижнем уровне _статический_ язык.

> А мне надо что б int a уже небыло.
> Была идея описывать как void* a;, а в конструкторе уже выделять память и задавать тип.
> (Конструктор ненаследуется). Но сказали что не так надо делать. Может есть чтото типа virtual там или как?

осознайте пожалуйста, что придумываете себе идиотские проблемы с этим ублюдочным С++.

Вам нужно только int/double? Ну сделайте union.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
tinimi



Зарегистрирован: 27.03.2005
Сообщения: 90
Откуда: Win32

СообщениеДобавлено: Вс Мар 27 2005 21:39    Заголовок сообщения: Ответить с цитатой

Вообще ето мне препод такое задание дал.
И решение не union и не то что писали.
Как пример он приводил - клас самолет, у него поле крылья
А потом ето поле расширяем типа до крутых крыльев, и надо сменить тип.
_________________
[ TiNiMi ]
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
dilmah



Зарегистрирован: 31.10.2004
Сообщения: 13

СообщениеДобавлено: Вс Мар 27 2005 22:59    Заголовок сообщения: Ответить с цитатой

tinimi писал(а):
Вообще ето мне препод такое задание дал.
И решение не union и не то что писали.
Как пример он приводил - клас самолет, у него поле крылья
А потом ето поле расширяем типа до крутых крыльев, и надо сменить тип.


поле изменить нельзя. Ты можешь сделать виртуальные get/set функции.
Они должны возвращать не объект, а ссылку (или указатель) на объект.
А в производном классе (крутом самолете) эта возвращает ссылку
на крутые крылья -- которые обязаны быть производными от крыльев.

почитай стандарт С++ на тему covariant return types.
Где-то в разделе 10.3 [class.virtual]
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
критикан



Зарегистрирован: 18.02.2005
Сообщения: 247

СообщениеДобавлено: Пн Мар 28 2005 09:16    Заголовок сообщения: И кто только придумывает ненужные проблемы Ответить с цитатой

Нужно комбинировать с модификаторами private/protected/public. Например:
#class A
{
private: int a;
};

struct B : public A
{
double a;
};

B v; // v.a -- доступно, v.A::a -- не доступно, но не исчезает.
----------------------------
И кто только придумывает ненужные проблемы
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
tinimi



Зарегистрирован: 27.03.2005
Сообщения: 90
Откуда: Win32

СообщениеДобавлено: Пн Мар 28 2005 22:36    Заголовок сообщения: Ответить с цитатой

Ну она просто в привате теперь и все. Просто ето все перикрытие, а мне надо заменить, притом что известно, что ето возможно(!).
_________________
[ TiNiMi ]
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
grayrat



Зарегистрирован: 30.06.2003
Сообщения: 189

СообщениеДобавлено: Ср Мар 30 2005 18:26    Заголовок сообщения: Ответить с цитатой

препод глумится. хочет чтобы ты сам допёр что так нельзя
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
tinimi



Зарегистрирован: 27.03.2005
Сообщения: 90
Откуда: Win32

СообщениеДобавлено: Ср Мар 30 2005 19:31    Заголовок сообщения: Ответить с цитатой

Да нет, походу можно.
препод не тот, что будет издеватся, и реально ето можно как-то сделать. и ето не прикол. Узнаю как-опубликую.
_________________
[ TiNiMi ]
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
tinimi



Зарегистрирован: 27.03.2005
Сообщения: 90
Откуда: Win32

СообщениеДобавлено: Ср Мар 30 2005 19:37    Заголовок сообщения: Ответить с цитатой

А вообще может ктото обьяснит как ето сделать,
Ну и если нет - то нормально аргументирует со ссылками на источники(стандарт,страус или еще че).
_________________
[ TiNiMi ]
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
критикан



Зарегистрирован: 18.02.2005
Сообщения: 247

СообщениеДобавлено: Чт Мар 31 2005 14:50    Заголовок сообщения: А что? Преподаватели изрекают только истины? Ответить с цитатой

tinimi писал(а):
А вообще может ктото обьяснит как ето сделать,
Ну и если нет - то нормально аргументирует со ссылками на источники(стандарт,страус или еще че).

По-моему, dilmah четко разъяснил, что наследование в С++ это расширение структуры. Изменение типа существующего поля при наследовании -- это нонсенс. Представим, что в классе есть публичный метод, использующий некое поле, и возможность изменять тип поля. Тогда как будет работать в наследнике этот метод, если изменить тип поля, с которым он работает?
------------
А что? Преподаватели изрекают только истины?
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
grayrat



Зарегистрирован: 30.06.2003
Сообщения: 189

СообщениеДобавлено: Чт Мар 31 2005 17:01    Заголовок сообщения: Ответить с цитатой

tinimi писал(а):
Да нет, походу можно.
препод не тот, что будет издеватся .

Да, он не издевается. Просто хочет чтобы ты копнул ОЧЕНЬ глубоко чтобы ПОНЯТЬ что так нельзя а не просто УЗНАТЬ
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
tinimi



Зарегистрирован: 27.03.2005
Сообщения: 90
Откуда: Win32

СообщениеДобавлено: Вс Апр 03 2005 10:49    Заголовок сообщения: Ответить с цитатой

Может оно и в правде так?
Но тогда опять таки - покажите мне источник, где ето написано.
Типа в стандарте, в книге или ще где. В електронном варианте. ПЛС.
_________________
[ TiNiMi ]
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
nut888



Зарегистрирован: 05.04.2005
Сообщения: 4

СообщениеДобавлено: Вт Апр 05 2005 20:02    Заголовок сообщения: Ответить с цитатой

Вообще если хранить int или double это однозначно union
Но надо иметь в виду что в union на C++ нельзя запихать
два объекта типа класса - проблема какой деструктор
будет вызван при уничтожении

Может тебе сделать один класс который имеет операторы приведения типа int и double

class A
{
protected:
// my super data
public:
operator int() { return 0; }
operator double() { return 1.1; }
}
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
tinimi



Зарегистрирован: 27.03.2005
Сообщения: 90
Откуда: Win32

СообщениеДобавлено: Ср Апр 06 2005 22:29    Заголовок сообщения: Ответить с цитатой

Не, ето тупоооооооооо.
Вообще можно написать типа void *a
А в конструкторе прописывать уже тип при new.
В деструкторе все уничтожать. Констр и деструктор не наследуются, в новом класе создаем новые, и соответственно новые типы.
Но тупо.
_________________
[ TiNiMi ]
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
tinimi



Зарегистрирован: 27.03.2005
Сообщения: 90
Откуда: Win32

СообщениеДобавлено: Пт Апр 08 2005 23:22    Заголовок сообщения: Ответить с цитатой

Граждане! Тема остается открытой!
Может хоть что то предложите?
_________________
[ TiNiMi ]
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
tinimi



Зарегистрирован: 27.03.2005
Сообщения: 90
Откуда: Win32

СообщениеДобавлено: Пт Апр 08 2005 23:33    Заголовок сообщения: Ответить с цитатой

Граждане! Тема остается открытой!
Может хоть что то предложите?
_________________
[ TiNiMi ]
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
droopy



Зарегистрирован: 28.07.2004
Сообщения: 168

СообщениеДобавлено: Сб Апр 09 2005 22:16    Заголовок сообщения: Ответить с цитатой

Код:

#include <iostream>

struct A
{
    void *a;
};

struct B : public A
{
    B( double aa ) : A()
    {
        a = new double( aa );
    }
};

main()
{
    B o( 1.2 );
    double *a = (double *)o.a;
    std::cout << *a;
}

хз.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail Посетить сайт автора
teapot7



Зарегистрирован: 17.04.2005
Сообщения: 2

СообщениеДобавлено: Вс Апр 17 2005 02:38    Заголовок сообщения: Ответить с цитатой

Цитата:
На екран выведет:
Код:
1.2
3

А мне надо что б int a уже небыло.


получаеться ты хочешь ликвидировать переменную базового класса int a ...

А вообще странно ...
Цитата:

Как пример он приводил - клас самолет, у него поле крылья
А потом ето поле расширяем типа до крутых крыльев, и надо сменить тип


в ООП у Буча когда хотим более крутой самолет, градусник, там еще всякие контроллеры были просто расширяем некрутой самолет крутым и используем его в дальнейшем(или если он не настолько крутой дописываем в интерфейс т.е. в public некоторые методы). При этом происходит перекомпиляция только потомка или изменений в интерфейсе а остальное остается.

Вообщем задание какоето хитро-ое и я тупой ...
Напиши когда реализуешь интересно...
_________________
Хочу научиться думать!
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
критикан



Зарегистрирован: 18.02.2005
Сообщения: 247

СообщениеДобавлено: Пн Апр 18 2005 10:16    Заголовок сообщения: что за глупость? никак не угомонятся перестройщики Ответить с цитатой

Вот вам код этого идиотского мероприятия по переделке типов полей
Код:

class A {
public:
...
int changeable; // поле с изменяемым типом. ВАЖНО! Должно быть последним в списке полей

A () { ... }
~A () { ... }

}

class B: public A {
char rest_of_changeable [sizeof (double) - sizeof (int)]; // массив, который дополняет последнее поле класса A до размера вещественного типа. ВАЖНО! Это поле должно быть первым, чтобы оно стало продолжением поля A::changeable. Поэтому и поле A::changeable должно быть последним в классе A

B () { ... } // при желании сюда поместить код, преобразующий целое A::changeable в вещественное A::changeable...rest_of_changeable [sizeof (double) - sizeof (int)]
~B () { ... } // аналогично в деструктор можно поместить обратный код

double& changeable_double() { return (double) A::changeable; } // обращаться к бывшему целому, а теперь вещественному нужно через данную функцию-ссылку. Если компилятор не пропустит эту чушь, то заставить его так:
/*
double& changeable_double() {
void* changeable_addr = &A::changeable;
return (double) *changeable_addr;
} */
}

B b;
cout << b.A::changeable; // выводцелого
cout << b.changeable_double(); // вывод вещественного

Естественно, таким способом можно переобразовать тип только одного, последнего в родительском классе, поля
-------------------------
что за глупость? никак не угомонятся перестройщики
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Показать сообщения:   
Этот форум закрыт, вы не можете писать новые сообщения и редактировать старые.   Эта тема закрыта, вы не можете писать ответы и редактировать сообщения.    Список форумов Архив форумов ЦИТФорума -> Программирование Часовой пояс: GMT + 3
Страница 1 из 1

 
Перейти:  
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах


Powered by phpBB © 2001, 2002 phpBB Group
Русская поддержка phpBB

 

IT-консалтинг Software Engineering Программирование СУБД Безопасность Internet Сети Операционные системы Hardware

Информация для рекламодателей PR-акции, размещение рекламы — adv@citforum.ru,
тел. +7 495 6608306, ICQ 232284597
Пресс-релизы — pr@citforum.ru
Послать комментарий
Информация для авторов
This Web server launched on February 24, 1997
Copyright © 1997-2000 CIT, © 2001-2006 CIT Forum
Внимание! Любой из материалов, опубликованных на этом сервере, не может быть воспроизведен в какой бы то ни было форме и какими бы то ни было средствами без письменного разрешения владельцев авторских прав. Подробнее...