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

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


удачи Вам
(круглый)
...
Рейтинг: 0 / 0
Производные классы в C++
    #33150774
Davyd
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
Производные классы в C++
    #33150793
Davyd
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сорри ;)
последняя строка:

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

myB.UseFun1();


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

Поясню...

Хотелось бы, чтобы 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
Производные классы в C++
    #33150889
redskin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Насчет п.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
Производные классы в C++
    #33150892
kolobok0
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ОТВЕТ...
нихрена не вызоветься....и даже не компильнёться... потому, что...
в строке...
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
Производные классы в C++
    #33150905
redskin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Davyd
Хотелось бы, чтобы myB.UseFun1(); использовала B::Fun1(), а не A::Fun1()
Простое объявление A::Fun1() как виртуальной, увы, здесь не помогает :(


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


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

ик..
...
Рейтинг: 0 / 0
Производные классы в C++
    #33150967
Davyd
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: 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
Производные классы в C++
    #33150975
redskin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Davyd
Код: plaintext
1.
2.
3.
4.
5.
class B : public A
{
public:
	virtual void g();//Здесь я virtual и НЕ поставил! :(
};

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

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

MS VC++7
Ммда... А отличия, похоже, действительно заключались только в отсутствии virtual в производном классе...
Или я что-то упустил?
...
Рейтинг: 0 / 0
Производные классы в C++
    #33151041
Davyd
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
У меня есть подозрения...
А существенно ли, если 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
Производные классы в C++
    #33151094
redskin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Davyd
Что же делать в этом случае, если требуется в конструкторе B вызывать B::g()?
Дело в том, что g() участвует в инициализации объекта и некоторым образом входит в конструктор. Неужели переписывать весь конструктор B::B()? Ведь отличия заключаются только в g()...

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

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

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

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

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


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