0

C++ のプライベート継承に関する質問がありました。私の質問は、このページhereに関連する参照に基づいています。(「継承が必要な場合はどうすればよいですか? 」という見出しの下)

ケースは、パブリック仮想関数を使用して基本クラスを宣言することです。次に、プライベート継承の下で基本クラスを継承し、派生クラスと名付けます。これは以下のように示されています

    class base {
            public:
            base() {}
            virtual ~base() {}
            virtual void func_1() {
                cout<<"base func1"<<endl;
            }
            void func_t() {
                cout<<"base funct"<<endl;
                func_3();
            }
            private:
            void func_3() {
                cout<<"base func3"<<endl;
                func_1();
            }
        };

class derived: private base {
public:
    derived() {}
    ~derived() {}
    virtual void func_1() {
        cout<<"derived func1"<<endl;
    }
};

base* b = new derived;
b->func_t();

上記のステートメントは、ベースが派生のアクセスできないベースであるというエラーを出します。上記の派生関数呼び出し関数の一部として func_1 を呼び出したい場合はどうすればよいですか?

4

2 に答える 2

1

プライベート基本クラスとして継承するため、 ( を含む)baseのすべてのパブリック メンバーが派生でプライベートになることを意味します。as として宣言すると、コンパイラは文句を言います。basebase::func_1derived::func_1public

パブリックとして必要な場合はderived::func_1、パブリックに継承する必要がありますbase。公開する必要がない場合は、derived::func_1非公開として宣言する必要があります。

于 2013-07-24T10:51:45.823 に答える
1

private外部から名前とメンバーにアクセスできないことを示します。プライベート基本クラスへの会話は 1 回です。この会話をメンバー関数にラップするだけで、機能させることができます。

class derived
  : private base {
public:
    // other stuff

    base* get_base() {
        return this;
    }
};

derived* d = new derived;
base* b = d->get_base();
b->func_t();
于 2013-07-24T10:26:56.210 に答える