1

私が理解したのは、EオブジェクトではCとDのオブジェクトがそれぞれcとdで参照されているということです。しかし、 c.set_n(3) が A.m_n の値を 3 に変更できるため、 d.set_c('b') が B.m_c を 'b' に初期化できない理由を理解できません。

    #include <iostream>

    class A
    {
    public:
        A(int n = 2) : m_n(n) {}

    public:
        int get_n() const { return m_n; }
        void set_n(int n) { m_n = n; }

    private:
        int m_n;
    };

    class B
    {
    public:
        B(char c = 'a') : m_c(c) {}

    public:
        char get_c() const { return m_c; }
        void set_c(char c) { m_c = c; }

    private:
        char m_c;
    };

    class C
        : virtual public A
        , public B
    { };

    class D
        : virtual public A
        , public B
    { };

    class E
        : public C
        , public D
    { };

    int main()
    {
        E e;  //object of E is created
        C &c = e; //c is used to refrence C object in E Object 
        D &d = e; //c and d has same inheritance structure 
        std::cout << c.get_c() << d.get_n();

        c.set_n(3);
        d.set_c('b');
        std::cout << c.get_c() << d.get_n() << std::endl;

        return 0;
    }
4

3 に答える 3

3

クラス構造を見てみましょう。 のインスタンスを作成するEと、オブジェクト階層は次のようになります。

 class B   class A   class B
     \       / \       /
      \     /   \     /
       \   /     \   /
      class C   class D
          \       /
           \     /
            \   /
           class E

Bのインスタンスが 2 つあるのに、 のインスタンスは 1 つしかないことがわかりますA。これは、仮想継承によるものです。Cとの両方が仮想継承Dを使用して継承するため、にAは のインスタンスが 1 つしかありません。Ae

次に、ユーザー コードを見てみましょう。

E e;
C &c = e; // reference C in the object hierarchy of E
D &d = e; // reference D in the object hierarchy of E

c.set_n(3); // set the value in the only instance of A in E
d.set_c('b'); // set the value of one of the two instances of B in your e

std::cout << c.get_c(); // print the value in the other instance of B in e
                        // not the one you set before
std::cout << d.get_n(); // print the value of the only instance of A in e
                        // this got changed before
于 2013-01-31T10:49:13.893 に答える
1

クラスのオブジェクトにはサブオブジェクトがE含まれCDサブオブジェクトにはそれぞれサブオブジェクトが含まれますB。に関する仮想継承がないため、およびBのそれぞれに独自ののコピーが含まれますCD B

d.set_c()次に、にB含まれDているものを参照し、を更新しますが、に含まれているものをc.get_c()参照します。これは、にB含まれCているものとは独立してDいるため、変更されていません。

クラスAとそのメンバーnの場合、仮想継承が使用されるため、このような問題はありません。これにより、クラスの最終オブジェクトには、アクセスされる「パス」に関係なく、すべての人が使用するEサブオブジェクトが1つだけ存在するようになります。A

于 2013-01-31T10:50:13.693 に答える
0

変化する

, public B

, virtual public B

出力を取得しますa2b3

あなたの例では、Eインスタンスには個別のインスタンスが含まれていBます。

于 2013-01-31T10:47:03.637 に答える