Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / Производные классы в C++ / 22 сообщений из 22, страница 1 из 1
05.07.2005, 15:19
    #33150348
Davyd
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Производные классы в C++
Простой вопрос.
Как использовать в базовом классе перегруженные функции-члены ещё не определённого производного класса?
Есть несколько извратный вариант... Может можно проще?
...
Рейтинг: 0 / 0
05.07.2005, 16:36
    #33150598
redskin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Производные классы в C++
Можно чуть подробней, что именно требуется? (хорошо бы посмотреть на вариант, который "извратный"). И главное, зачем это требуется?
...
Рейтинг: 0 / 0
05.07.2005, 17:06
    #33150706
costa78
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Производные классы в C++
Если класс еще не определен, откуда у него взялись перегруженные методы? :)
...
Рейтинг: 0 / 0
05.07.2005, 17:21
    #33150764
kolobok0
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Производные классы в C++
Если идёт речь о виртуальных методах, то сущность базового класса (нахрена он нужен) - заключаеться в выделении общей логики поведения для чайлдов отнаследуемых от него. Например...

Если у базового класса "ЗВЕРЬ" есть зубы (и они у него определены чиссо как виртуальные гы. :) ), то отнаследовать от данного класса чайлда "УЛИТКУ" - будет крайне проблематично :)


удачи Вам
(круглый)
...
Рейтинг: 0 / 0
05.07.2005, 17:25
    #33150774
Davyd
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Производные классы в C++
class A
{
public:
void Fun1(){/*некоторое определение...*/}
void UseFun1() { Fun1(); } // Как-то используется void A::Fun1()
};

class B:public A
{
public:
void Fun1(){/*перегрузка функции void A::Fun1()*/}
};


void main()
{
A myA;
B myB;
B.UseFun1();
}

Вопрос "на засыпку": что вызовется последней строкой?
...
Рейтинг: 0 / 0
05.07.2005, 17:28
    #33150793
Davyd
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Производные классы в C++
Сорри ;)
последняя строка:

myB.UseFun1();
...
Рейтинг: 0 / 0
05.07.2005, 17:34
    #33150824
redskin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Производные классы в C++
DavydСорри ;)
последняя строка:

myB.UseFun1();


1) Это не перегрузка, это переопределение
2) Рекомендую прочитать в какой-нибудь книге по c++ главу про виртуальные функции
3) Если объекты создаются на стеке, а не динамически, то и виртуальность в нашем случае мало поможет
...
Рейтинг: 0 / 0
05.07.2005, 17:50
    #33150888
Davyd
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Производные классы в C++
Благодарю!
Правда, про виртуальные функции я уже битый час читаю: ничего нового, но извратный вариант можно сообразить ;)

Поясню...

Хотелось бы, чтобы myB.UseFun1(); использовала B::Fun1(), а не A::Fun1()
Простое объявление A::Fun1() как виртуальной, увы, здесь не помогает :(

Извратный вариант.

class A
{
A* pA;
public:
A(){}
A(A* set_pA){ pA=set_pA; }
virtual void Fun1(){/*некоторое определение...*/}
void UseFun1() { pA->Fun1(); } // Как-то используется void A::Fun1()
};

class B:public A
{
public:
B(){ A::A(this); }
void Fun1(){/*перегрузка функции void A::Fun1()*/}
};


void main()
{
B myB;
myB.UseFun1();
}

Теперь последняя строка вызывает B::Fun1()
ВОПРОС: есть ли средства в С++, позволяющие получить тот же результат более элегантно?
...
Рейтинг: 0 / 0
05.07.2005, 17:50
    #33150889
redskin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Производные классы в C++
Насчет п.3 я погорячился немного, пардон....
Вот кусок кода, для иллюстрации:

Код: 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.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
class A
{
public:
	void f();
	virtual void g();
};

class B : public A
{
public:
	virtual void g();
};

void A::f()
{
	cout << "A::f()" << endl;
	g();
}

void A::g()
{
	cout << "A::g()" << endl;
}

void B::g()
{
	cout << "B::g()" << endl;
}


int main()
{

	A* p1 = new A();
	p1->f();

	A* p2 = new B();
	p2->f();

	A a;
	a.f();

	B b;
	b.f();

	return  0 ;
}
...
Рейтинг: 0 / 0
05.07.2005, 17:50
    #33150892
kolobok0
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Производные классы в C++
ОТВЕТ...
нихрена не вызоветься....и даже не компильнёться... потому, что...
в строке...
B.UseFun1(); // попытка позвать статично, не статический метод...

если имелось ввиду...
myB.UseFun1();

то позовёться метод юзе фанк у класса А и тот в свою очередь позовёт свой же метод фанк одын (класс А). Одноимённые методы, если не обьявлены как виртуальные "зовуться" из области видимости.


с уважением
(круглый)
ЗЫ
Встречная "засыпка"...

class A
{
public:
A() { printf("Constructor A\r\n"); Fun1(); };
virtual void Fun1() { printf("A::Fun1\r\n"); };
};

class B: public A
{
public:
virtual void Fun1() { printf("B::Fun1\r\n"); };
};

int main() {

printf("Main\r\n");
B myB;
myB.Fun1();
A myA = myB;
myA.Fun1();
A* pA = &myB;
pA->Fun1();

return 0; }
что будет на экране консоли ? BBAB, ABAB, BBBB ?
...
Рейтинг: 0 / 0
05.07.2005, 17:55
    #33150905
redskin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Производные классы в C++
Davyd
Хотелось бы, чтобы myB.UseFun1(); использовала B::Fun1(), а не A::Fun1()
Простое объявление A::Fun1() как виртуальной, увы, здесь не помогает :(


Почему не помогает?
Что вы там такое курите то? :))
Посмотрите мой вариант.
...
Рейтинг: 0 / 0
05.07.2005, 17:57
    #33150913
kolobok0
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Производные классы в C++
а чисто виртуальный метод не катит уже ?


(круглый)
...
Рейтинг: 0 / 0
05.07.2005, 18:05
    #33150937
kolobok0
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Производные классы в C++
да и не чистый - прокатит... тут правильно было выше сказано...

ик..
...
Рейтинг: 0 / 0
05.07.2005, 18:19
    #33150967
Davyd
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Производные классы в C++
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
class A
{
public:
	void f();
	virtual void g();//Это было...
};

class B : public A
{
public:
	virtual void g();//Здесь я virtual и НЕ поставил! :(
};

Ну вот теперь всё и прояснилось :)
Всем БОЛЬШОЕ спасибо!
...
Рейтинг: 0 / 0
05.07.2005, 18:24
    #33150975
redskin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Производные классы в C++
Davyd
Код: plaintext
1.
2.
3.
4.
5.
class B : public A
{
public:
	virtual void g();//Здесь я virtual и НЕ поставил! :(
};

Ну вот теперь всё и прояснилось :)
Всем БОЛЬШОЕ спасибо!

Это какой же у вас компилятор? Название и версия?
Просто во втором virtual необходимости нет.
Если метод объявлен virtual в базовом классе, то в производных это слово можно опустить. Хотя, лучше писать для наглядности.
...
Рейтинг: 0 / 0
05.07.2005, 18:32
    #33150994
Davyd
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Производные классы в C++
redskin
Это какой же у вас компилятор? Название и версия?
Просто во втором virtual необходимости нет.
Если метод объявлен virtual в базовом классе, то в производных это слово можно опустить. Хотя, лучше писать для наглядности.

MS VC++7
Ммда... А отличия, похоже, действительно заключались только в отсутствии virtual в производном классе...
Или я что-то упустил?
...
Рейтинг: 0 / 0
05.07.2005, 18:54
    #33151041
Davyd
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Производные классы в C++
У меня есть подозрения...
А существенно ли, если f() - конструктор? Т.е. проблема выглядела так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
class A
{
public:
	A(){ g(); }
	virtual void g();
};

class B : public A
{
public:
	virtual void g();
};

void A::g() {	cout << "A::g()" << endl;	}
void B::g() {	cout << "B::g()" << endl;	}


void main()
{
	A a;//Здесь вызывается A::g()
	B b;//И здесь вызывается A::g()
}

Что же делать в этом случае, если требуется в конструкторе B вызывать B::g()?
Дело в том, что g() участвует в инициализации объекта и некоторым образом входит в конструктор. Неужели переписывать весь конструктор B::B()? Ведь отличия заключаются только в g()...
...
Рейтинг: 0 / 0
05.07.2005, 19:26
    #33151094
redskin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Производные классы в C++
Davyd
Что же делать в этом случае, если требуется в конструкторе B вызывать B::g()?
Дело в том, что g() участвует в инициализации объекта и некоторым образом входит в конструктор. Неужели переписывать весь конструктор B::B()? Ведь отличия заключаются только в g()...

AFAIK, так делать нельзя.
Если дизайн подразумевает какую-то сложную инициализацию на конструкторе с вызовом виртуальных методов, то... лучше поменять дизайн :) Можно просто вынести из конструктора общий код в какую-нибудь функцию, (обзовем ее Init), которую вызывать сразу после создания объекта. Либо сделать еще лучше и вдобавок сделать сам конструктор закрытым, а создание объектов выполнять через специальную функцию. (В умных книжках их обычно называют "фабриками класса" или "виртуальными конструкторами")
...
Рейтинг: 0 / 0
05.07.2005, 21:42
    #33151204
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Производные классы в C++
Виртуальные функции называются. Сделай функцию виртуальной и используй.
Только не используй в конструкторах и деструкторах.
...
Рейтинг: 0 / 0
05.07.2005, 21:45
    #33151205
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Производные классы в C++
redskin3) Если объекты создаются на стеке, а не динамически, то и виртуальность в нашем случае мало поможет
Скажи пожалуйста, как поведение перегруженных/переопределенных/виртуальных функций зависит от того, как создан объект ? Никак она от этого не зависит.
...
Рейтинг: 0 / 0
05.07.2005, 21:52
    #33151210
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Производные классы в C++
DavydУ меня есть подозрения...
А существенно ли, если f() - конструктор? Т.е. проблема выглядела так:

Да. Или если деструктор. Прочитай как работают виртуальные методы в конструкторах и деструкторах.

Davyd
Что же делать в этом случае, если требуется в конструкторе B вызывать B::g()?
Дело в том, что g() участвует в инициализации объекта и некоторым образом входит в конструктор. Неужели переписывать весь конструктор B::B()? Ведь отличия заключаются только в g()...

Нет. Надо вынести код создания в отдельный метод инициализации. А в конструкторе только создавать объекты и инициализировать поля.
Даже такой pattern есть для реализации такой штуки - Factory Method.
(Если знаешь MFC , там нечно подобное делает класс CDocTemplate и его наследники).
...
Рейтинг: 0 / 0
05.07.2005, 23:00
    #33151244
redskin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Производные классы в C++
MasterZiv redskin3) Если объекты создаются на стеке, а не динамически, то и виртуальность в нашем случае мало поможет
Скажи пожалуйста, как поведение перегруженных/переопределенных/виртуальных функций зависит от того, как создан объект ? Никак она от этого не зависит.

Я ж написал, в следующем сообщении, что дал маху с этим пунктом :-\ Что и подвердил куском кода... Что еще не так?
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / Производные классы в C++ / 22 сообщений из 22, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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