Как получить доступ к члену класса одной ветви иерархии, используя указатель класса из другой ветви? - PullRequest
3 голосов
/ 06 мая 2020
              class A
              /     \
          class B1  class B2

Все классы имеют только члены publi c.

Class A унаследовано публично и содержит виртуальные функции-члены и невиртуальные функции-члены с операторами печати (cout) по умолчанию, class B1 и class B2 имеет только не виртуальные функции, с определением виртуальных функций из class A.

Я хочу знать, как получить доступ ко всем членам B2 с помощью указателя B1, для которого можно использовать приведение.

Например:

B2 obj_b2;
B1* b1_ptr=&obj_b2;

// Using b1_ptr, access all members of obj_b2

Если да, то можно ли расширить это до более глубоких ветвей, например:

              class A
              /     \
          class B1  class B2
            /   \     /   \
       class C1 ...  ...  ...

(Доступ к членам class C1 , et c. из второй ветки)


EDIT 1:

Может быть, это поможет; это пример, который я написал:

#include<iostream>
using namespace std;
class A{
public:
    virtual void v_f1(){
        cout<<"virtual A::v_f1()\n";
    }
    void f1(){
        cout<<"A::f1()\n";
    }
};
class B1 : public A{
public:
    virtual void v_f2(){
        cout<<"virtual B1::v_f2()\n";
    }
    void v_f1(){
        cout<<"A<-B1::v_f1()\n";
    }
    void f2(){
        cout<<"B1::f2()\n";
    }
};
class C1 : public B1{
public:
    void v_f2(){
        cout<<"B1<-C1::v_f2()\n";
    }
    void f3(){
        cout<<"C1::f3()\n";
    }
};
class D : public C1{
public:
    void f4(){
        cout<<"D::f4()\n";
    }
};
class B2 : public A{
public:
    void v_f(){
        cout<<"A<-B2::v_f()\n";
    }
    void f5(){
        cout<<"B2::f5()\n";
    }
};
class C2 : public B2{
public:
    void f6(){
        cout<<"C2::f6()\n";
    }
};
int main(){
    C2 c2_obj;
    C2* c2_obj_ref=&c2_obj;
    D* d_ptr = dynamic_cast<D*>(c2_obj_ref);

    // This statement gives segmentation fault,
    // if commented out, the code works fine.
    d_ptr->v_f();

    // These work fine
    d_ptr->f();
    dynamic_cast<C2*>(d_ptr)->f5();
    dynamic_cast<C2*>(d_ptr)->f6();
    return 0;
}

Ответы [ 2 ]

6 голосов
/ 06 мая 2020

Объект типа B1 не имеет членов, объявляемых B2.

Если вы пытаетесь рассматривать объект как тип, которым он не является, ваша программа имеет неправильный формат.

3 голосов
/ 06 мая 2020

Вы в принципе не можете.

B1 наследуется от A, но ничего не знает ни о каком другом классе, наследуемом от A. Вы можете преобразовать объект B1 в A или преобразовать A в объект B1. Если вы сделаете и то, и другое, у вас будет исключение плохого приведения или нулевой ptr (см. Комментарии). Я не уверен), так что вы можете потерять некоторую информацию о B2 из апкаста, который вы можете вспомнить в своем подавленном состоянии. класс и должны отличаться по-другому. Например, предположим, что A - это Character, B1 - это Soldier, а B2 - Creature, вы можете просто иметь класс A и унаследованный класс AInstance с частным параметром bool soldier и bool creature, которые вы затем можете использовать для печати или алгоритмов.

Надеюсь, что это поможет!

...