1

私はこのコードスニペットを持っています

    #include <iostream>
    using namespace std;
    class Polygon
    {
        public:
            int publicmemberPolygon;
        private:
            int privatememberPolygon;
        protected:
            int protectedmemberPolygon;
   };

    class Square : public Polygon
    {
    public:
        int Getter();
     };
    int Square::Getter()
    {
    return privatememberPolygon;
    }

    int main()
    {
    }

問題は、なぜprivatememberPolygonにアクセスできないのですか? 派生クラスがある場合、そのメンバー/関数はすべてコピーされますか? ありがとう

4

3 に答える 3

3

いいえ、基本クラスからパブリックに派生する場合、そのクラスpublicprotectedメンバーのみが派生クラスにアクセスできます。こちらのFAQもご覧ください。

次の例を参照してください。

class Base
{

public:
    void setPrivate(int p) 
    {
        m_private = p;
    }

public:
    int m_public;
protected:
    int m_protected;
private:
    int m_private;
};

class Derived : public Base
{
public:
    void f()
    {
        m_public = 0; // Can access public member of base class
        m_protected = 0; //Can access protected member of base class
        m_private = 0; //Compiler error- Can not access private member of base class
    }
};

int main() {

    Derived d;
    d.setPrivate(10); //m_private is still part of the derived class. Hence can call setPrivate
    return 0;

}
于 2012-04-22T03:05:11.697 に答える
2

パブリックに継承する場合、継承でアクセスできるのは、パブリックおよび保護されたデータ メンバーのみです。

于 2012-04-22T03:05:29.290 に答える
2

メンバーは派生クラスに「コピー」されません。派生クラスには、メンバー変数がある場合とほとんど同じように、基本クラスのサブオブジェクトが含まれます。

実際、コンポジションと非パブリック継承は、同じ問題を解決するための 2 つの方法と見なされることがよくあります。

非パブリック継承との些細な違いは、ベース サブオブジェクトのメンバーを見つけるためにオブジェクト名で修飾する必要がないことです。パブリック継承では、派生クラスへのポインターまたは参照から、基本クラスへのポインターまたはメンバーへの暗黙的な変換もあります。

大きな違いは、継承では仮想関数をオーバーライドできますが、構成ではオーバーライドできないことです。

また、protectedメンバー (およびベース) は、最終的な分析では実質的に役に立ちvirtualません。仮想関数がすでに継承を必要としている場合に使用されることがあります。

于 2012-04-22T03:33:55.177 に答える