web-dev-qa-db-ja.com

C ++:プライベート名が派生型を汚染するのを防ぐ方法は?

このコードスニペットにあいまいな名前参照があるという事実に、今日ショックを受けました。

class A
{
private:
    typedef int Type;
};

class B
{
public:
    typedef int Type;
};

class D : A, B
{
    Type value;//error: reference to 'Type' is ambiguous
};

うーん!あなたがクラスAの作成者であり、あなたのクラスはすでにさまざまな人々やさまざまなプロジェクトによってどこでも使用されていると想像してください。ある日、Aクラスを書き直すことにしました。これは、他の人のコードを壊さない限り、新しいクラスで新しい(プライベートの)名前を使用できないことを意味しませんか?

ここでの慣習は何ですか?

14
zwhconst

ここには問題はありません。シンボルが存在しないのはプライベートだからではありません。プライベートメンバーにアクセスしようとすると、コンパイラーはアクセスできないと通知しますが、それは存在しません。

また、シンボルを完全に修飾せずに多重継承を使用することは悪い習慣だと思います。

class D : A, B
{
    B::Type value;
};
0
Nop