powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Абстракные классы Help - тупняк напал
16 сообщений из 16, страница 1 из 1
Абстракные классы Help - тупняк напал
    #34287253
dimadv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте, простой пример, но неработает. помогите разобраться почему.

Код: 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.
<...упрощенный пример Эккель  474 >
class CInstrument
{
public:
    virtual void Play() const =  0 ;

};

class CWind:public CInstrument
{
public:
    void Play() 
    {
        cout << "CWind::Play" << endl;
    };
};

class CViola:public CInstrument
{
public:
    void Play() 
    {
        cout << "CViola::Play" << endl;
    };
};

void f(CInstrument& i)
{
  i.Play();
}

void main()
{
    CWind cW;
    //cW.Play();

    CViola cV;
    //cV.Play();

    f(cW);
    f(cV);
}
<...>


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
--------------------Configuration: task_oop1 - Win32 Debug--------------------
Compiling...
task_oop1.cpp
D:\work\task_oop1_v3. 3 \task_oop1.cpp( 54 ) : error C2259: 'CWind' : cannot instantiate abstract class due to following members:
        D:\work\task_oop1_v3. 3 \task_oop1.cpp( 20 ) : see declaration of 'CWind'
D:\work\task_oop1_v3. 3 \task_oop1.cpp( 54 ) : warning C4259: 'void __thiscall CInstrument::Play(void) const' : pure virtual function was not defined
        D:\work\task_oop1_v3. 3 \task_oop1.cpp( 16 ) : see declaration of 'Play'
D:\work\task_oop1_v3. 3 \task_oop1.cpp( 54 ) : error C2259: 'CWind' : cannot instantiate abstract class due to following members:
        D:\work\task_oop1_v3. 3 \task_oop1.cpp( 20 ) : see declaration of 'CWind'
D:\work\task_oop1_v3. 3 \task_oop1.cpp( 54 ) : warning C4259: 'void __thiscall CInstrument::Play(void) const' : pure virtual function was not defined
        D:\work\task_oop1_v3. 3 \task_oop1.cpp( 16 ) : see declaration of 'Play'
D:\work\task_oop1_v3. 3 \task_oop1.cpp( 57 ) : error C2259: 'CViola' : cannot instantiate abstract class due to following members:
        D:\work\task_oop1_v3. 3 \task_oop1.cpp( 30 ) : see declaration of 'CViola'
D:\work\task_oop1_v3. 3 \task_oop1.cpp( 57 ) : warning C4259: 'void __thiscall CInstrument::Play(void) const' : pure virtual function was not defined
        D:\work\task_oop1_v3. 3 \task_oop1.cpp( 16 ) : see declaration of 'Play'
D:\work\task_oop1_v3. 3 \task_oop1.cpp( 57 ) : error C2259: 'CViola' : cannot instantiate abstract class due to following members:
        D:\work\task_oop1_v3. 3 \task_oop1.cpp( 30 ) : see declaration of 'CViola'
D:\work\task_oop1_v3. 3 \task_oop1.cpp( 57 ) : warning C4259: 'void __thiscall CInstrument::Play(void) const' : pure virtual function was not defined
        D:\work\task_oop1_v3. 3 \task_oop1.cpp( 16 ) : see declaration of 'Play'
Error executing cl.exe.

task_oop1.obj -  4  error(s),  4  warning(s)
...
Рейтинг: 0 / 0
Абстракные классы Help - тупняк напал
    #34287260
Фотография Ruslan.Isbarov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
virtual void Play() const =  0 ;

А зачем тут const?

Код: plaintext
1.
virtual void Play() =  0 ;
...
Рейтинг: 0 / 0
Абстракные классы Help - тупняк напал
    #34287271
Фотография Ruslan.Isbarov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вариант № 2:

Код: 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.
#include <iostream>


class CInstrument
{
public:
    virtual void Play() const =  0 ;
};

class CWind:public CInstrument
{
public:
    void Play() const
    {
        std::cout << "CWind::Play" << std::endl;
    };
};

class CViola:public CInstrument
{
public:
    void Play() const
    {
        std::cout << "CViola::Play" << std::endl;
    };
};

void f(CInstrument& i)
{
    i.Play();
}

void main()
{
    CWind cW;
    CViola cV;

    f(cW);
    f(cV);
}
...
Рейтинг: 0 / 0
Абстракные классы Help - тупняк напал
    #34287274
dimadv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ruslan.Isbarov
Код: plaintext
1.
virtual void Play() const =  0 ;

А зачем тут const?


Конечно const тут непричем. но библиотека iostrem у меня подключена и по этому поводу конфликотов нет.
...
Рейтинг: 0 / 0
Абстракные классы Help - тупняк напал
    #34287277
Фотография Ruslan.Isbarov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Причем здесь iostream?

Вы определяете виртуальную функцию-член Play() и помечаете ее как const. Естесственно, что в производных классах также нужно Play() пометить как const (см. вариант № 2):

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
{
public:
    virtual void Play() const =  0 ;
};

class CWind:public CInstrument
{
public:
    void Play() const { cout << "CWind::Play" << endl; };
};

class CViola:public CInstrument
{
public:
    void Play() const { cout << "CViola::Play" << endl; };
};

Либо вообще убрать const:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
{
public:
    virtual void Play() =  0 ;
};

class CWind:public CInstrument
{
public:
    void Play() { cout << "CWind::Play" << endl; };
};

class CViola:public CInstrument
{
public:
    void Play() { cout << "CViola::Play" << endl; };
};
...
Рейтинг: 0 / 0
Абстракные классы Help - тупняк напал
    #34287281
Фотография Ruslan.Isbarov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вообще, iostream я использовал просто для проверки работоспособности Вашего примера. Привычка у меня пользоваться iostream'ом.
...
Рейтинг: 0 / 0
Абстракные классы Help - тупняк напал
    #34287321
dimadv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
)) Спасибо !!!
...
Рейтинг: 0 / 0
Абстракные классы Help - тупняк напал
    #34287334
Amdei
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Извините за ламерский вопрос:
А CWind::Play() объявлять как virtual не надо?
...
Рейтинг: 0 / 0
Абстракные классы Help - тупняк напал
    #34287346
Фотография Ruslan.Isbarov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AmdeiИзвините за ламерский вопрос:
А CWind::Play() объявлять как virtual не надо?
Надо, если Вы хотите создать класс, производный от CWind и заместить в нем функцию-член Play().
...
Рейтинг: 0 / 0
Абстракные классы Help - тупняк напал
    #34287351
Фотография Ruslan.Isbarov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Amdei
А вообще, рекомендую почитать ...
...
Рейтинг: 0 / 0
Абстракные классы Help - тупняк напал
    #34287359
Amdei
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ruslan.Isbarov AmdeiИзвините за ламерский вопрос:
А CWind::Play() объявлять как virtual не надо?
Надо, если Вы хотите создать класс, производный от CWind и заместить в нем функцию-член Play().Гм. Т.е. это не то что требвоалось в исходном посте?
Ну тогда ладно...
...
Рейтинг: 0 / 0
Абстракные классы Help - тупняк напал
    #34287374
Фотография Ruslan.Isbarov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AmdeiГм. Т.е. это не то что требвоалось в исходном посте?
Вообще-то в исходном посте, от класса CInstrument создавались 2 производных класса - CWind и CViola. В обоих производных классах замещается функция Play() базового класса. Поэтому, в классе CInstrument функция Play() является виртуальной.
...
Рейтинг: 0 / 0
Абстракные классы Help - тупняк напал
    #34287377
Amdei
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А какая может быть практическая ценность от перееопределения виртуальной функции базового класса как не виртуальной в производном(ых)?
...
Рейтинг: 0 / 0
Абстракные классы Help - тупняк напал
    #34287429
Фотография Ruslan.Isbarov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AmdeiА какая может быть практическая ценность от перееопределения виртуальной функции базового класса как не виртуальной в производном(ых)?
Вам стоит почитать про динамический полиморфизм. А также, взгляните на следующий пример:

Код: 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.
#include <iostream>

class A
{
public:
	virtual void abc()
	{
		std::cout << "A::abc()" << std::endl;
	};
};

class B : public A
{
public:
	void abc()
	{
		std::cout << "B::abc()" << std::endl;
	};
};

class C : public A
{
public:
	void abc()
	{
		std::cout << "C::abc()" << std::endl;
	};
};

int main()
{
	A* arr[ 2 ];

	arr[ 0 ] = new B();
	arr[ 1 ] = new C();

	for (int i =  0 ; i <  2 ; i++)
	{
		arr[i]->abc();
	}
}

Попробуйте в этом случае обойтись без виртуальных функций-членов.
...
Рейтинг: 0 / 0
Абстракные классы Help - тупняк напал
    #34287432
Фотография Ruslan.Isbarov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, кстати, результат работы этой программы:

Код: plaintext
1.
2.
B::abc()
C::abc()
...
Рейтинг: 0 / 0
Абстракные классы Help - тупняк напал
    #34288175
Amdei
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2Ruslan.Isbarov: Спасибо :-)

Собственно моё недоразумение вызвал возникший у меня вопрос, отличаются ли чем-нибуть следующие фрагменты кода:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
class A {
public:
	virtual void abc();
};

class B : public A {
public:
	void abc();
};
и
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
class A {
public:
	virtual void abc();
};

class B : public A {
public:
	virtual void abc();
};
Аж полез в стандарт, и в пункте 10.3.2 выяснил, что они ничем не отличаются.
Но в своей практике я всегда писал как во втором примере - для облегчения последующих разбирательств.
Вот.
...
Рейтинг: 0 / 0
16 сообщений из 16, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / Абстракные классы Help - тупняк напал
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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