c++ 如何在OOP中处理多级多路径继承?

mzsu5hc0  于 2023-03-09  发布在  其他
关注(0)|答案(1)|浏览(156)

如何处理多级多路径继承情况(C++中的OOP)?例如:

A
                
B       C
                    
D
                
E       F
                    
G

以上是给定的类,它们的层次结构可以理解为“A”是“B”和“C”的父类,“D "是”E“和”F“的父类。现在,”D“是”B“和”C“的子类,类似地,”G“是”E“和”F“的子类。
现在,假设我创建了一个类G的变量,那么我知道我可以从G本身访问E,F的元素,也可以从G访问D的元素,使用C中的作用域解析操作符,但是我如何更进一步,从G本身访问B,C,甚至A的元素,使用作用域解析操作符,或者说其他方法,如果有的话?
下面是我用来实现这个的一些C
代码-

G obj;

obj.g = 1; // G's element
obj.e = 2; // E's element
obj.f = 3; // F's element

obj.E::d = 41; // Accessing D's element via E using scope resolution operator
obj.F::d = 42; // Accessing D's element via F using scope resolution operator

现在我该如何从这里走得更高?
然后我试着用类似的方式接近更高的元素-

obj.E::D::b = 211; // First way I tried

obj.F.D::b = 212; // Second way I tried

第一个显示了一个错误,指出“”D“是”G“的不明确的基址“,第二个显示了一个错误,指出”“F::F”的无效使用“。
什么是正确的方式来实现这一点,并访问比这更高的元素?或者有什么方式可以做到这一点?

pzfprimi

pzfprimi1#

不确定如何通过访问器实现这一点,但逐层转换类型是可行的。

#include <stdio.h>
#include <iostream>

struct A{int a;};
struct B: public A{int b;};
struct C: public A{int c;};
struct D: public B, public C{int d;};
struct E: public D{int e;};
struct F: public D{int f;};
struct G: public E, public F {int g;};

int main (){
    G obj{};
    obj.g = 1;
    static_cast<E&>(obj).d = 41;
    static_cast<F&>(obj).d = 42;
    static_cast<B&>(static_cast<E&>(obj)).a = 43;
    std::cout << "g: " << obj.g << std::endl;
    std::cout << "d1: " << ((E&)obj).d << std::endl;
    std::cout << "d2: " << ((F&)obj).d << std::endl;
    return 0;
}

相关问题