7

「構造体にはデフォルトでパブリック継承があります」このステートメントは実際にはどういう意味ですか?そして、cからクラスdを導出するときに、キーワード「public」を省略したという理由だけで、次のコードが誤っているのはなぜですか?

struct c 
{
protected:
    int i;
public:
    c(int ii=0):i(ii){} 
    virtual c *fun();
};

c* c::fun(){
    cout<<"in c";
    return &c();
}

class d : c
{  
public:
    d(){}
    d* fun()
    {
        i = 9;
        cout<<"in d"<<'\t'<<i;
        return &d();
    }
};


int main()
{
    c *cc;
    d dd;
    cc = &dd;
    cc->fun();
}
4

3 に答える 3

12

だということだ

struct c;
struct d : c

と同等です

struct d : public c

あなたのコードはclass拡張structです:

struct c;
class d : c;

と同等です

class d : private c;

classデフォルトでプライベート継承があるためです。

そして、それは、から継承され、オーバーライド/オーバーロード/非表示にされていないすべてのメソッドcがでプライベートであることを意味しますd

于 2012-05-06T18:57:29.927 に答える
6

「構造体はデフォルトでパブリック継承を持っています」はこれを意味します

struct Derived : Base {};

と同等です

struct Derived : public Base {};

クラスにはデフォルトでプライベートpublic継承があるため、クラス継承からを削除すると、同等のものが得られます。

class Derived : private Base {};

このプライベート継承のシナリオでDerivedは、is-aとの関係はなくBase、本質的に-aです Base。したがって、ここで試行しようとしている変換は次のとおりです。

cc = &dd;

許可されていません。

于 2012-05-06T19:04:26.450 に答える
2

structアクセス指定子を指定せずにを記述して何かから継承すると、その継承はとして扱われpublicます。classアクセス指定子を指定せずに(何かが)を記述して継承する場合struct、その継承はプライベートとして扱われます。あなたのコードでは後者を行っているので、継承はプライベートであり、したがって観察されたエラーです。

言い換えると、struct継承がデフォルトでパブリックであると言うことは、実際には、aを書き込むときに行われる継承がデフォルトでパブリックであることを意味し、aからstruct継承がデフォルトでパブリックであることを意味しません。struct

于 2012-05-06T19:02:55.273 に答える