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;
}