0

私のサブクラスでは、サブクラスでそれを再定義することによってスーパークラスのメンバー変数または型を隠しており、サブクラスによって隠されているメンバー変数を使用する関数呼び出しがどうなるか疑問に思っています。例として:

class A {
    class X {
        int x;
    };

    X getX() {
         return x_;
    }
protected:
    X x_;
public:
    vector<X> x_vector_;
}

class B : public A {
    class x {
         int x;
         int y;
    };
protected:
    X x_;
}

私が次のことをするとどうなりますか:

B b;
b.getX();

Q1:これは戻ってきますA::x_B::x_??

どうですか:

B b;
b.x_vector_;

Q2: b.x_vector_ はタイプvector<A::X>ですかvector<B::X>??

4

2 に答える 2

0

なんてこと?

// Example translation unit
#include <vector>

using namespace std;

class A {
    class X {
        int x;
    };

    getX() {
         return x_;
    }

    X x_;
    vector<X> x_vector_;
}

class B : public A {
    class x {
         int x;
         int y;
    };

    X x_;
}

コンパイル エラーの例:

> g++ -Wall -pedantic tmp.cpp
tmp.cpp:10:10: error: ISO C++ forbids declaration of 'getX' with no type [-fpermissive]
tmp.cpp:16:1: error: expected ';' after class definition
tmp.cpp: In member function 'int A::getX()':
tmp.cpp:11:17: error: cannot convert 'A::X' to 'int' in return
tmp.cpp: At global scope:
tmp.cpp:6:11: error: 'class A::X' is private
tmp.cpp:24:5: error: within this context
tmp.cpp:25:1: error: expected ';' after class definition

特に: error: 'class A::X' is private.

Q: サブクラスがスーパークラスのプライベート (「非表示」) メンバーまたはメンバー関数にアクセスすることをどのように正確に提案しますか?

于 2013-10-01T23:46:44.987 に答える
0

次のコンパイル可能なコードを試しました。

#include <iostream>

using namespace std;

class A {
public:
    class X {
    public:
        X () {
            i_ = 1;
        }

        int getI() {
            return i_;
        }

     protected:
        int i_;
     };

int getX() {
    return xobject_.getI();
}


protected:
    X xobject_;
};


class B : public A {
public:
    class X : public A::X {
    public:
        X() {
            i_ = 5;
        }

        int getI() {
            return i_;
        }
    protected:
        int i_;
    };


protected:
    X xobject_;
};


int main (int argc, char** arv) {
    B b;
    std::cout << "value of b.getX(): " << b.getX() << std::endl;
    return 0;
}

出力:

value of b.getX(): 1

これは両方の質問に答えます。getX()サブクラスで関数とベクトルを再定義しないとx_vector、スーパー クラスのメンバーが使用されます。

于 2013-10-02T15:29:10.987 に答える