C++ 多个虚拟继承,类共享同一个子对象

C++ Multiple virtual inheritance, classes share the same subobject

提问人:MANAR Oussama 提问时间:2/20/2023 更新时间:2/20/2023 访问量:53

问:

我想从“类 B”继承“x”,从“类 C”继承“y”,但两个类共享同一个“A”子对象。有什么解决办法吗?

#include <iostream>

class A {
    protected:
        int x;
        int y;
    public:
        A() : x(10), y(10) {}
};

class B : virtual public A {
    public:
        B() {this->x = 20; this->y = 20;}
};

class C : virtual public A {
    public:
        C() {this->x = 30; this->y = 30;}
};

class D : public B, public C {
    public:
        D() {
            this->x = this->B::x;
            this->y = this->C::y;
            std::cout << "x = " << this->x << std::endl;
            std::cout << "y = " << this->y << std::endl;
        }
};

int main() {
    D obj;
    return 0;
}

我该如何解决这个问题?

C++ 多重 虚拟继承

评论

2赞 Nathan Pierson 2/20/2023
我不明白你的要求。它们既没有独立的,也没有可言的,它们都只有一个子对象。BCxyA
2赞 aschepler 2/20/2023
这似乎是一个 XY 问题。你为什么要做这样的事情?
2赞 Pete Becker 2/20/2023
这就是虚拟继承的意义所在。如果需要并具有不同的子对象,请不要使用虚拟继承。BCA
0赞 curiousguy 3/4/2023
如果你想解决一个实际问题,请描述一下。如果你的问题是你的思维方式,请描述你是如何得出结论的。

答:

1赞 Fooble 2/20/2023 #1

这是通过使用组合而不是继承来解决的主要问题之一。

https://en.wikipedia.org/wiki/Composition_over_inheritance

D 对象可以包含 B 和 C 的实例,而不是从 B 和 C 继承。请参阅以下示例:

#include <iostream>

class A {
protected:
    int x;
    int y;
public:
    A() : x(10), y(10) {}
    
    int GetX() {
        return x;
    }
    
    int GetY() { 
        return y;
    }
};

class B : virtual public A {
public:
    B() {this->x = 20; this->y = 20;}
};

class C : virtual public A {
public:
    C() {this->x = 30; this->y = 30;}
};

class D {
public:
    D() {
        std::cout << "x = " << this->b.GetX() << std::endl;
        std::cout << "y = " << this->c.GetY() << std::endl;
    }
private:
    B b;
    C c;
};

int main() {
    D obj;
    return 0;
}