C++.Бархатный путь


Множественное наследование - часть 4


A* pObjA; B* pObjB; C* pObjC; D* pObjD = &MyD; // Мы начинаем с объявления соответствующих указателей. pObjC = (C*)&MyD; pObjA = (A*)pObjC; // Произведена настройка указателей на требуемые фрагменты. pObjA->x0 = 999; // А это уже элементарно!

Очевидно, что можно обойтись без поэтапных преобразований и воспользоваться свойством коммутативности операции явного преобразования типа:

((A*)(C*)pObjD)->x0 = 5; ((A*)(B*)pObjD)->x0 = 55; // Разным фрагментам - разные значения.

Аналогичным образом обстоят дела с функциями-членами базовых классов. Этот раздел мы завершаем небольшой программой, демонстрирующей методы доступа к членам базовых фрагментов объекта производного класса.

#include <iostream.h> class A { public: int x0; int Fun1(int key); }; int A::Fun1(int key) { cout << " Fun1( " << key << " ) from A " << endl; cout << " x0 == " << x0 << "..." << endl; return 0; } class B: public A { public: int x0; int Fun1(int key); int Fun2(int key); }; int B::Fun1(int key) { cout << " Fun1( " << key << " ) from B " << endl; cout << " x0 == " << x0 << "..." << endl; return 0; } int B::Fun2(int key) { Fun1(key * 5); cout << " Fun2( " << key << " ) from B " << endl; cout << " x0 == " << x0 << "..." << endl; return 0; } class C: public A { public: int x0; int Fun2(int key); }; int C::Fun2(int key) { A::x0 = 25; Fun1(key * 5); cout << " Fun2( " << key << " ) from C " << endl; cout << " x0 == " << x0 << "..." << endl; return 0; } class D: public B, public C { public: int x0; int Fun1(int key); }; int D::Fun1(int key) { cout << " Fun1( " << key << " ) from D " << endl; cout << " x0 == " << x0 << "..." << endl; return 0; } void main () { D MyD; ObjD.x0 = 111; A* pObjA; B* pObjB; C* pObjC; D* pObjD = &MyD; MyD.B::x0 = 100; MyD.C::x0 = 333; MyD.Fun1(1); pObjD->B::Fun1(1); pObjD->C::Fun2(1); pObjA = (A*) (B*) pObjD; ((A*) ((C*) pObjD))->Fun1(111); ((A*) ((B*) pObjD))->Fun1(111); pObjA->Fun1(111); pObjC = (C*)&MyD; pObjA = (A*)pObjC; ((A*)(B*)pObjD)->x0 = 1; ((A*)(B*)pObjD)->Fun1(777); ((A*)(C*)pObjD)->x0 = 2; ((A*)(C*)pObjD)->Fun1(999); }

| |

 




- Начало -  - Назад -  - Вперед -