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

Код: 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
27.01.2007, 15:30
    #34287260
Ruslan.Isbarov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Абстракные классы Help - тупняк напал
Код: plaintext
1.
virtual void Play() const =  0 ;

А зачем тут const?

Код: plaintext
1.
virtual void Play() =  0 ;
...
Рейтинг: 0 / 0
27.01.2007, 15:48
    #34287271
Ruslan.Isbarov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Абстракные классы Help - тупняк напал
Вариант № 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
27.01.2007, 15:59
    #34287274
dimadv
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Абстракные классы Help - тупняк напал
Ruslan.Isbarov
Код: plaintext
1.
virtual void Play() const =  0 ;

А зачем тут const?


Конечно const тут непричем. но библиотека iostrem у меня подключена и по этому поводу конфликотов нет.
...
Рейтинг: 0 / 0
27.01.2007, 16:07
    #34287277
Ruslan.Isbarov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Абстракные классы Help - тупняк напал
Причем здесь 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
27.01.2007, 16:10
    #34287281
Ruslan.Isbarov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Абстракные классы Help - тупняк напал
Вообще, iostream я использовал просто для проверки работоспособности Вашего примера. Привычка у меня пользоваться iostream'ом.
...
Рейтинг: 0 / 0
27.01.2007, 17:07
    #34287321
dimadv
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Абстракные классы Help - тупняк напал
)) Спасибо !!!
...
Рейтинг: 0 / 0
27.01.2007, 17:27
    #34287334
Amdei
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Абстракные классы Help - тупняк напал
Извините за ламерский вопрос:
А CWind::Play() объявлять как virtual не надо?
...
Рейтинг: 0 / 0
27.01.2007, 17:40
    #34287346
Ruslan.Isbarov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Абстракные классы Help - тупняк напал
AmdeiИзвините за ламерский вопрос:
А CWind::Play() объявлять как virtual не надо?
Надо, если Вы хотите создать класс, производный от CWind и заместить в нем функцию-член Play().
...
Рейтинг: 0 / 0
27.01.2007, 17:44
    #34287351
Ruslan.Isbarov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Абстракные классы Help - тупняк напал
Amdei
А вообще, рекомендую почитать ...
...
Рейтинг: 0 / 0
27.01.2007, 17:57
    #34287359
Amdei
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Абстракные классы Help - тупняк напал
Ruslan.Isbarov AmdeiИзвините за ламерский вопрос:
А CWind::Play() объявлять как virtual не надо?
Надо, если Вы хотите создать класс, производный от CWind и заместить в нем функцию-член Play().Гм. Т.е. это не то что требвоалось в исходном посте?
Ну тогда ладно...
...
Рейтинг: 0 / 0
27.01.2007, 18:19
    #34287374
Ruslan.Isbarov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Абстракные классы Help - тупняк напал
AmdeiГм. Т.е. это не то что требвоалось в исходном посте?
Вообще-то в исходном посте, от класса CInstrument создавались 2 производных класса - CWind и CViola. В обоих производных классах замещается функция Play() базового класса. Поэтому, в классе CInstrument функция Play() является виртуальной.
...
Рейтинг: 0 / 0
27.01.2007, 18:21
    #34287377
Amdei
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Абстракные классы Help - тупняк напал
А какая может быть практическая ценность от перееопределения виртуальной функции базового класса как не виртуальной в производном(ых)?
...
Рейтинг: 0 / 0
27.01.2007, 19:24
    #34287429
Ruslan.Isbarov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Абстракные классы Help - тупняк напал
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
27.01.2007, 19:34
    #34287432
Ruslan.Isbarov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Абстракные классы Help - тупняк напал
Да, кстати, результат работы этой программы:

Код: plaintext
1.
2.
B::abc()
C::abc()
...
Рейтинг: 0 / 0
28.01.2007, 18:45
    #34288175
Amdei
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Абстракные классы Help - тупняк напал
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
Форумы / C++ [игнор отключен] [закрыт для гостей] / Абстракные классы Help - тупняк напал / 16 сообщений из 16, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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