1

保護された継承を使用して仮想関数を作成します

#include<iostream>
using namespace std;
class D{
private:
    int a;
protected:
    int b;
public:
    D(){a=b=c=0;}
    virtual void f(){
    a=2;
    cout <<"D::f"<<a<<endl;
    }
    void g(){cout<<"D::g"<<a<<endl;}
    int c;
};
class E:protected D{
    private:
        int a,b,c;
    public:
        E(){a=b=c;}
        void f(){
            a=3;
            cout<<"E::f"<<a<<endl;
        }
        void g(){cout<<"E::g"<<a<<endl;}
};
int main(){
    D *d = new E;
    d->f();
    d->g();
    return 0;
}

しかし、私がそれを使用すると、アクセスできないベースになります。

公的継承に変更すれば実行できます。

なぜD*d =newEを使用できないのだろうか。プライベートで保護された継承で?

事前にThx。

4

2 に答える 2

3

privateまたはprotectedベースは、ベースが世界にアクセスできないことを意味します。したがって、派生ベースからアクセスできないベースへの変換を必要とする式を作成する場合、変換は世界の一部である呼び出しサイトで行われる必要があるため、アクセシビリティ規則により禁止されています。

オブジェクト指向の用語では、privateまたはベースprotectedis-関係を定義しません。それは実際には、より単純な用語での構成である、用語で実装された関係です。

于 2013-01-09T20:09:49.857 に答える
1

非公開継承は「is-a」関係を定義しないため、コンパイラは通常、暗黙的なアップキャストを許可しません

以下はうまくいくでしょうが、それは悪い考え/デザインです

D*d = (D*)(new E);
于 2013-01-09T20:11:07.940 に答える