2016-09-07 14 views
2

私は継承の問題を持っている: の継承場合、FOO()曖昧である理由のは、私がC++の継承 - あいまいな機能

class Time{ 
protected: 
void foo(); 
}; 

とも

class Base: private Time{ 
void foo1(){ foo(); } 
}; 

class Child: public Base, private Time{ 
void foo2(){ foo(); }// here my compiler says that foo is ambiguous 
}; 

を持っているとしましょうベースでの時間はプライベートですか?

PS。 ちょうど&フルコードを見る必要がある人のためだけに、GitHubプロジェクトです: https://github.com/huntekah/Interior_decorator-OpenGL_Project/blob/master/Grafika-OpenGL/Interior_decorator/Display.cpp#L133 class Time(ユーティリティディレクトリ)は、ControlのベースであるControlObjectsとControlCameraによって継承されます。表示はコントロールを継承し、さらに時間を継承します。コメント行は、SetDeltaTime()が曖昧な場所を示します。

+0

プライベートでは非表示にしません。 – Jarod42

+0

'Base'と' Time'の両方に 'foo'という名前のメンバ関数があり、コンパイラはどちらを呼び出そうとしているのか分かりません。どこかのところにこれの房があります。 –

+0

ベース内の名前空間は非表示になりますか? –

答えて

0

予備的な発言あなたのコードスニペットは、別の理由のためにコンパイルされません

:それはプライベートなメンバーであるようBaseTimefoo()にアクセスできません。そのため、foo1()は、あいまいさが報告される前にエラーを引き起こします。

あなたはそのメンバーを保護するためにTimeを変更する場合は、あなたが記述とおりにエラーを再現することができます

class Time{ 
protected: 
    void foo(); 
}; 

ここで何が悪いのでしょうか?

Baseは、個人的にはTimeを継承しているため、メンバは外部から見えないと予想されます。

しかし、外部の世界にとって真実である可能性は、派生クラスでは当てはまりません。派生した場合の名前の検索ルールは最初の名前は、クラス階層内で検索されていると言うだけで、アクセス制御が行われるよりも、その後、適用されるオーバーロード:

10.2/1 Member name lookup determines the meaning of a name (id-expression) in a class scope. Name lookup can result in an ambiguity, in which case the program is ill-formed. For an id-expression, name lookup begins in the class scope of this; for a qualified-id, name lookup begins in the scope of the nested-name-specifier. Name lookup takes place before access control.
10.2/8 If the name of an overloaded function is unambiguously found, overloading resolution also takes place before access control. Ambiguities can often be resolved by qualifying a name with its class name.

あなたは多重継承を使用すると:

Time  
    : 
    : 
Base Time 
    \ : 
    \ : 
    Child 

foo()の2度継承されます.1回は私的継承によって公開され、公開されます。このあいまいさにより、標準ではfoofoo2()という名前が曖昧になり、アクセスが確認される前にコードが無効になります。

子供は2つのfoo()を見ていますが、皮肉なことに、どちらも使用できないことに注意してください。どちらもプライベート継承されます。したがって、あいまいさを解決しても、アクセシビリティに関する別のエラーメッセージが表示されます。

1

あなたのコードには別のエラーがあります。クラスbaseはクラスTimeからクラスを継承し、クラスclassはクラスtimeから個人的に継承します!!!

継承の法則:それはそれから継承するため

class Time 
{}; 

class Base : private Time 
{}; 

class Child : public Base, private Time 
{}; 

基本は授業時間のコピーを持っています。

子は、それが継承するため、Baseクラスのコピーがあります。

***親は(Base)にこのコピーがあるため、子はTimeクラスのコピーを持っています。

ChildがクラスTimeから明示的に継承しようとすると、コンパイル時エラーが発生します。エラーC2584: 'Child':直接ベース 'Time'にアクセスできません。すでに 'Base'のベース

関連する問題