Предыдущая тема :: Следующая тема |
Автор |
Сообщение |
tinimi
Зарегистрирован: 27.03.2005 Сообщения: 90 Откуда: Win32
|
Добавлено: Вс Мар 27 2005 13:29 Заголовок сообщения: Тупее вопрос вы врядли вобще найдете |
|
|
тупейший вопрос.
Нужен пример(чисто код и все, в коде я разберусь).
есть 2 класа, один наследник другого, при етом надо что б в наследнике происходила перегрузка поля(не метода). Всмысле менялся тип. ну типа в родителе int a, а в наследнике уже double a. Приведите плс пример кода. _________________ [ TiNiMi ] |
|
Вернуться к началу |
|
![](templates/subSilver/images/spacer.gif) |
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;
}
|
а самому что лень? |
|
Вернуться к началу |
|
![](templates/subSilver/images/spacer.gif) |
tinimi
Зарегистрирован: 27.03.2005 Сообщения: 90 Откуда: Win32
|
Добавлено: Вс Мар 27 2005 16:27 Заголовок сообщения: спасибо |
|
|
Вообще то нет, просто я С++ только начинаю учить.
По тому что привел droopy:
Воопервых надо class а не struct, но ето пол беды
Основное - надо сделать что бы не перекрывались(!) имена. В данном случае посто перекрываются имена, а мне надо что бы в наследнике небыло(!) того int a, а был сразу double a грубо говоря, что бы ето заменялось. А в данном примере вроде просто у нас 2 поля. Ну и естестно надо что б все с class _________________ [ TiNiMi ] |
|
Вернуться к началу |
|
![](templates/subSilver/images/spacer.gif) |
droopy
Зарегистрирован: 28.07.2004 Сообщения: 168
|
Добавлено: Вс Мар 27 2005 18:40 Заголовок сообщения: |
|
|
ну с класс это ты сам переводи. это плевое дело.
а переменные как раз заменяются, (int a) в новом классе не будет,
если я ошибаюсь ты меня опровергни. |
|
Вернуться к началу |
|
![](templates/subSilver/images/spacer.gif) |
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 ] |
|
Вернуться к началу |
|
![](templates/subSilver/images/spacer.gif) |
tinimi
Зарегистрирован: 27.03.2005 Сообщения: 90 Откуда: Win32
|
Добавлено: Вс Мар 27 2005 18:55 Заголовок сообщения: |
|
|
На екран выведет:
А мне надо что б int a уже небыло.
Была идея описывать как void* a;, а в конструкторе уже выделять память и задавать тип. (Конструктор ненаследуется). Но сказали что не так надо делать. Может есть чтото типа virtual там или как? _________________ [ TiNiMi ] |
|
Вернуться к началу |
|
![](templates/subSilver/images/spacer.gif) |
droopy
Зарегистрирован: 28.07.2004 Сообщения: 168
|
Добавлено: Вс Мар 27 2005 19:50 Заголовок сообщения: |
|
|
я не знаю чтоб поля можно было определять как virtual.
имхо это для функций. |
|
Вернуться к началу |
|
![](templates/subSilver/images/spacer.gif) |
dilmah
Зарегистрирован: 31.10.2004 Сообщения: 13
|
Добавлено: Вс Мар 27 2005 20:52 Заголовок сообщения: |
|
|
> а переменные как раз заменяются, (int a) в новом классе не будет, если я ошибаюсь ты меня опровергни.
Наследование в С++ это _расширение_ структуры. Поле исчезнуть не может, и тип
его поменяться не может. Может только добавиться, возможно перекрывая имя.
С++ на нижнем уровне _статический_ язык.
> А мне надо что б int a уже небыло.
> Была идея описывать как void* a;, а в конструкторе уже выделять память и задавать тип.
> (Конструктор ненаследуется). Но сказали что не так надо делать. Может есть чтото типа virtual там или как?
осознайте пожалуйста, что придумываете себе идиотские проблемы с этим ублюдочным С++.
Вам нужно только int/double? Ну сделайте union. |
|
Вернуться к началу |
|
![](templates/subSilver/images/spacer.gif) |
tinimi
Зарегистрирован: 27.03.2005 Сообщения: 90 Откуда: Win32
|
Добавлено: Вс Мар 27 2005 21:39 Заголовок сообщения: |
|
|
Вообще ето мне препод такое задание дал.
И решение не union и не то что писали.
Как пример он приводил - клас самолет, у него поле крылья
А потом ето поле расширяем типа до крутых крыльев, и надо сменить тип. _________________ [ TiNiMi ] |
|
Вернуться к началу |
|
![](templates/subSilver/images/spacer.gif) |
dilmah
Зарегистрирован: 31.10.2004 Сообщения: 13
|
Добавлено: Вс Мар 27 2005 22:59 Заголовок сообщения: |
|
|
tinimi писал(а): | Вообще ето мне препод такое задание дал.
И решение не union и не то что писали.
Как пример он приводил - клас самолет, у него поле крылья
А потом ето поле расширяем типа до крутых крыльев, и надо сменить тип. |
поле изменить нельзя. Ты можешь сделать виртуальные get/set функции.
Они должны возвращать не объект, а ссылку (или указатель) на объект.
А в производном классе (крутом самолете) эта возвращает ссылку
на крутые крылья -- которые обязаны быть производными от крыльев.
почитай стандарт С++ на тему covariant return types.
Где-то в разделе 10.3 [class.virtual] |
|
Вернуться к началу |
|
![](templates/subSilver/images/spacer.gif) |
критикан
Зарегистрирован: 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 -- не доступно, но не исчезает.
----------------------------
И кто только придумывает ненужные проблемы |
|
Вернуться к началу |
|
![](templates/subSilver/images/spacer.gif) |
tinimi
Зарегистрирован: 27.03.2005 Сообщения: 90 Откуда: Win32
|
Добавлено: Пн Мар 28 2005 22:36 Заголовок сообщения: |
|
|
Ну она просто в привате теперь и все. Просто ето все перикрытие, а мне надо заменить, притом что известно, что ето возможно(!). _________________ [ TiNiMi ] |
|
Вернуться к началу |
|
![](templates/subSilver/images/spacer.gif) |
grayrat
Зарегистрирован: 30.06.2003 Сообщения: 189
|
Добавлено: Ср Мар 30 2005 18:26 Заголовок сообщения: |
|
|
препод глумится. хочет чтобы ты сам допёр что так нельзя |
|
Вернуться к началу |
|
![](templates/subSilver/images/spacer.gif) |
tinimi
Зарегистрирован: 27.03.2005 Сообщения: 90 Откуда: Win32
|
Добавлено: Ср Мар 30 2005 19:31 Заголовок сообщения: |
|
|
Да нет, походу можно.
препод не тот, что будет издеватся, и реально ето можно как-то сделать. и ето не прикол. Узнаю как-опубликую. _________________ [ TiNiMi ] |
|
Вернуться к началу |
|
![](templates/subSilver/images/spacer.gif) |
tinimi
Зарегистрирован: 27.03.2005 Сообщения: 90 Откуда: Win32
|
Добавлено: Ср Мар 30 2005 19:37 Заголовок сообщения: |
|
|
А вообще может ктото обьяснит как ето сделать,
Ну и если нет - то нормально аргументирует со ссылками на источники(стандарт,страус или еще че). _________________ [ TiNiMi ] |
|
Вернуться к началу |
|
![](templates/subSilver/images/spacer.gif) |
критикан
Зарегистрирован: 18.02.2005 Сообщения: 247
|
Добавлено: Чт Мар 31 2005 14:50 Заголовок сообщения: А что? Преподаватели изрекают только истины? |
|
|
tinimi писал(а): | А вообще может ктото обьяснит как ето сделать,
Ну и если нет - то нормально аргументирует со ссылками на источники(стандарт,страус или еще че). |
По-моему, dilmah четко разъяснил, что наследование в С++ это расширение структуры. Изменение типа существующего поля при наследовании -- это нонсенс. Представим, что в классе есть публичный метод, использующий некое поле, и возможность изменять тип поля. Тогда как будет работать в наследнике этот метод, если изменить тип поля, с которым он работает?
------------
А что? Преподаватели изрекают только истины? |
|
Вернуться к началу |
|
![](templates/subSilver/images/spacer.gif) |
grayrat
Зарегистрирован: 30.06.2003 Сообщения: 189
|
Добавлено: Чт Мар 31 2005 17:01 Заголовок сообщения: |
|
|
tinimi писал(а): | Да нет, походу можно.
препод не тот, что будет издеватся . |
Да, он не издевается. Просто хочет чтобы ты копнул ОЧЕНЬ глубоко чтобы ПОНЯТЬ что так нельзя а не просто УЗНАТЬ |
|
Вернуться к началу |
|
![](templates/subSilver/images/spacer.gif) |
tinimi
Зарегистрирован: 27.03.2005 Сообщения: 90 Откуда: Win32
|
Добавлено: Вс Апр 03 2005 10:49 Заголовок сообщения: |
|
|
Может оно и в правде так?
Но тогда опять таки - покажите мне источник, где ето написано.
Типа в стандарте, в книге или ще где. В електронном варианте. ПЛС. _________________ [ TiNiMi ] |
|
Вернуться к началу |
|
![](templates/subSilver/images/spacer.gif) |
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; }
} |
|
Вернуться к началу |
|
![](templates/subSilver/images/spacer.gif) |
tinimi
Зарегистрирован: 27.03.2005 Сообщения: 90 Откуда: Win32
|
Добавлено: Ср Апр 06 2005 22:29 Заголовок сообщения: |
|
|
Не, ето тупоооооооооо.
Вообще можно написать типа void *a
А в конструкторе прописывать уже тип при new.
В деструкторе все уничтожать. Констр и деструктор не наследуются, в новом класе создаем новые, и соответственно новые типы.
Но тупо. _________________ [ TiNiMi ] |
|
Вернуться к началу |
|
![](templates/subSilver/images/spacer.gif) |
tinimi
Зарегистрирован: 27.03.2005 Сообщения: 90 Откуда: Win32
|
Добавлено: Пт Апр 08 2005 23:22 Заголовок сообщения: |
|
|
Граждане! Тема остается открытой!
Может хоть что то предложите? _________________ [ TiNiMi ] |
|
Вернуться к началу |
|
![](templates/subSilver/images/spacer.gif) |
tinimi
Зарегистрирован: 27.03.2005 Сообщения: 90 Откуда: Win32
|
Добавлено: Пт Апр 08 2005 23:33 Заголовок сообщения: |
|
|
Граждане! Тема остается открытой!
Может хоть что то предложите? _________________ [ TiNiMi ] |
|
Вернуться к началу |
|
![](templates/subSilver/images/spacer.gif) |
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;
}
|
хз. |
|
Вернуться к началу |
|
![](templates/subSilver/images/spacer.gif) |
teapot7
Зарегистрирован: 17.04.2005 Сообщения: 2
|
Добавлено: Вс Апр 17 2005 02:38 Заголовок сообщения: |
|
|
Цитата: | На екран выведет:
Код:
1.2
3
А мне надо что б int a уже небыло.
|
получаеться ты хочешь ликвидировать переменную базового класса int a ...
А вообще странно ...
Цитата: |
Как пример он приводил - клас самолет, у него поле крылья
А потом ето поле расширяем типа до крутых крыльев, и надо сменить тип |
в ООП у Буча когда хотим более крутой самолет, градусник, там еще всякие контроллеры были просто расширяем некрутой самолет крутым и используем его в дальнейшем(или если он не настолько крутой дописываем в интерфейс т.е. в public некоторые методы). При этом происходит перекомпиляция только потомка или изменений в интерфейсе а остальное остается.
Вообщем задание какоето хитро-ое и я тупой ...
Напиши когда реализуешь интересно... _________________ Хочу научиться думать! |
|
Вернуться к началу |
|
![](templates/subSilver/images/spacer.gif) |
критикан
Зарегистрирован: 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(); // вывод вещественного
|
Естественно, таким способом можно переобразовать тип только одного, последнего в родительском классе, поля
-------------------------
что за глупость? никак не угомонятся перестройщики |
|
Вернуться к началу |
|
![](templates/subSilver/images/spacer.gif) |
|