powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / вопрос по множественному наследованию
9 сообщений из 9, страница 1 из 1
вопрос по множественному наследованию
    #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
вопрос по множественному наследованию
    #33007688
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не противоречит если наследовать интерфейсы.
...
Рейтинг: 0 / 0
вопрос по множественному наследованию
    #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
вопрос по множественному наследованию
    #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
вопрос по множественному наследованию
    #33007906
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я любитель не только Джаббы

Было-бы неплохо, Мастер-Зив, если-бы ты прокомментировал свой сорц с указанием когда стоит применять первый вариант наследования а когда второй.
...
Рейтинг: 0 / 0
вопрос по множественному наследованию
    #33007926
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторили это противоречит человеческой логике?
Противоречит почти всегда IMHO. Ежа с ужом скрещивает тока франкенштейн.
______________________________________________
Вы имеете право хранить молчание! Всё что Вы скажете может быть использовано против Вас в суде!
...
Рейтинг: 0 / 0
вопрос по множественному наследованию
    #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
вопрос по множественному наследованию
    #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
вопрос по множественному наследованию
    #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
9 сообщений из 9, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / вопрос по множественному наследованию
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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