Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / вопрос по множественному наследованию / 9 сообщений из 9, страница 1 из 1
11.04.2005, 11:14
    #33007644
alex_k
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вопрос по множественному наследованию
Код: plaintext
1.
2.
3.
class base;
class childA:public base;
class childB:public base;
можно ли сделать так:
Код: plaintext
1.
class result:public classA, public classB;
или это противоречит человеческой логике?
...
Рейтинг: 0 / 0
11.04.2005, 11:27
    #33007688
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вопрос по множественному наследованию
Не противоречит если наследовать интерфейсы.
...
Рейтинг: 0 / 0
11.04.2005, 12:00
    #33007800
zuzu
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вопрос по множественному наследованию
можно, юзай virtual
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
class A
{
public:
	int a;
};

class B: virtual public A
{
public:
	int b;
};

class C: virtual public A
{
public:
	int c;
};

class result: public B,C
{
public:
	int rez;
};
...
Рейтинг: 0 / 0
11.04.2005, 12:15
    #33007852
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вопрос по множественному наследованию
Нет,можно сделать и не противоречит в любом случае, а не только при наследовании итерфейсов, как утверждают тут некоторые , подозреваю, любители языка Jabba. Только вот смысл будет разный в зависимости от
того, как напишешь :
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
// так
class result : public classA, public classB
{
  ...
};
//или так
class result : virtual public classA, virtual public classB
{
  ...
};

ЗЫ: Любителям языка Jabba этого не понять.
...
Рейтинг: 0 / 0
11.04.2005, 12:29
    #33007906
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вопрос по множественному наследованию
Я любитель не только Джаббы

Было-бы неплохо, Мастер-Зив, если-бы ты прокомментировал свой сорц с указанием когда стоит применять первый вариант наследования а когда второй.
...
Рейтинг: 0 / 0
11.04.2005, 12:36
    #33007926
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вопрос по множественному наследованию
авторили это противоречит человеческой логике?
Противоречит почти всегда IMHO. Ежа с ужом скрещивает тока франкенштейн.
______________________________________________
Вы имеете право хранить молчание! Всё что Вы скажете может быть использовано против Вас в суде!
...
Рейтинг: 0 / 0
11.04.2005, 14:32
    #33008381
gardenman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вопрос по множественному наследованию
Код: 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.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
#include <stdlib.h>
#include <iostream>

using namespace std;

#define PRINT_CONSTRUCTOR  cout<<__PRETTY_FUNCTION__<<endl

class A {
public:
	A() {
		PRINT_CONSTRUCTOR;
	}	
};

class P1: public A {
public:	
	P1() {
		PRINT_CONSTRUCTOR;
	}
};

class P2: public A {
public:	
	P2() {
		PRINT_CONSTRUCTOR;
	}
};

class A1A2: public P1,P2 {
public:
	A1A2() {
		PRINT_CONSTRUCTOR;
	}
};
	


class V1: virtual public A {
public:	
	V1() {
		PRINT_CONSTRUCTOR;
	}
};

class V2: virtual public A {
public:	
	V2() {
		PRINT_CONSTRUCTOR;
	}
};

class V1V2: virtual public V1,V2 {
public:
	V1V2() {
		PRINT_CONSTRUCTOR;
	}
};


	


int main() {
	cout << "Just public:" <<endl;
	A1A2 a1a2;
	cout << "Virtual base class:" <<endl;
	V1V2 va1a2;
	return  0 ;
}


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
Just public:
A::A()
P1::P1()
A::A()
P2::P2()
A1A2::A1A2()

Virtual base class:
A::A()
V1::V1()
V2::V2()
V1V2::V1V2()
...
Рейтинг: 0 / 0
11.04.2005, 17:27
    #33008989
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вопрос по множественному наследованию
Каждый прямой или косвенный насдедник класса base содержит в своем составе собственный экземпляр подобъекта класса base до тех пор, пока во всех ветках наследования от base не стоит ключевое слово virtual. Т.е. virtual в наследовании говорит, что "я, такой-то такой-то, являясь наследником класса такого-то, готов разделять экземпляр своего предка с другими наследниками от него". Ну и далее все просто - на каждого наследника , который не готов разделять предка, заводится свой подъобъект предка, и затем для всех остальных, которые готовы разделять - еще один общий. Соотв, если все наследники готовы разделять предка, то экземпляр только один.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
class base;
class childA:virtual public base;
class childB:virtual public base;

class result1:public classA, public classB
// класс result1 содержит два подоъекта base : classA::base и classB::base
{};

class result2:virtual public classA, virtual public classB
// класс result2 содержит один подоъект base : classA::base и classB::base - это одно и то же.
{};

На мой взгляд, интересно, что когда люди производят наследование, то как правило в наследование вкладывается именно семантика разделения предка, т.е. существования только одного экземпляра подобъекта-предка. Т.е. полагалось бы писать class B: virtual public A. Но программист вряд ли отдает себе в этом отчет и вообще задумывается об этом, потому что при линейном наследовании это не имеет значения. Именно поэтому по умолчанию в С++ наследования выделяет отдельные экземпляры предков, т.е. применяется без virtual, потому что априоре нельзя гарантировать, что кажный наследник не требует выделенного экземпляра своих предков. Если бы virtual -наследование применялось бы по умолчанию, это был бы ужас, летящий на крыльях ночи для любых мало-мальски сложных иерархий классов.
...
Рейтинг: 0 / 0
26.12.2005, 22:50
    #33458416
acc15
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вопрос по множественному наследованию
поправка
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
class base;
class childA:virtual public base;
class childB:virtual public base;

class result1:public classA, public classB
// класс result1 содержит один подоъект base : classA::base и classB::base - это одно и то же.
{};

class result2:virtual public classA, virtual public classB
// класс result2 содержит один подоъект base : classA::base и classB::base - это одно и то же.
{};
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
class base;
class childA:public base;
class childB:public base;

class result1:public classA, public classB
// хоть ставь виртуал, хоть не ставь. БУДЕТ 2 ОБЪЕКТА base
{};

class result2:virtual public classA, virtual public classB
// хоть ставь виртуал, хоть не ставь. БУДЕТ 2 ОБЪЕКТА base
{};
т.к. classA и classB делится объектами не хотят...
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / вопрос по множественному наследованию / 9 сообщений из 9, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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