タグ付けされた質問 「inheritance」

継承とは、オブジェクト指向プログラミングのシステムであり、オブジェクトは独自の定義を提供する必要なく、前の型によって定義された操作をサポートできます。これは、オブジェクト指向プログラミングにおけるポリモーフィズムの主要なベクトルです。

15
C#:戻り値の型のオーバーライド
C#で戻り値の型をオーバーライドする方法はありますか?もしそうなら、どのように、そしてそうでなければ、なぜそしてそれを行うための推奨される方法は何ですか? 私の場合は、抽象基本クラスとその子孫とのインターフェースがあります。私はこれをやりたいと思います(実際にはそうではありませんが、例として!): public interface Animal { Poo Excrement { get; } } public class AnimalBase { public virtual Poo Excrement { get { return new Poo(); } } } public class Dog { // No override, just return normal poo like normal animal } public class Cat { public override …

13
JavaScriptの継承[クローズ]
クローズ。この質問はもっと焦点を合わせる必要があります。現在、回答を受け付けていません。 この質問を改善したいですか?質問を更新して、この投稿を編集するだけで1つの問題に焦点を当てるようにします。 2年前に閉鎖されました。 この質問を改善する javascriptで継承を実装しようとしています。私はそれをサポートするために次の最小限のコードを思いついた。 function Base(){ this.call = function(handler, args){ handler.call(this, args); } } Base.extend = function(child, parent){ parent.apply(child); child.base = new parent; child.base.child = child; } 専門家の皆さん、これで十分か、または私が見逃したかもしれない他の重要な問題があるかどうかをお知らせください。直面している同様の問題に基づいて、他の変更を提案してください。 完全なテストスクリプトは次のとおりです。 function Base(){ this.call = function(handler, args){ handler.call(this, args); } this.superalert = function(){ alert('tst'); } } Base.extend = function(child, parent){ parent.apply(child); …

2
コピーコンストラクターでのC ++名前空間の競合
私は次のコードを持っています: namespace A { struct Foo { int a; }; } struct Foo { int b; }; struct Bar : public A::Foo { Bar(Foo foo) { c = foo.b; } int c; }; A :: Fooにはbという名前のメンバーがないため、C ++コンパイラーは「c = foo.b」で不平を言います。:: FooでBarパラメータのタイプを変更すると、機能します。 私の質問は、この動作の背後にある合理的なものは何ですか(私はそれが継承によってBarがA名前空間に入るようにするという事実に関係していると思いますが、この理論をサポートするドキュメントを見つけることができません。

1
C ++のクラスのサイズがデータメンバーのパブリック/プライベートステータスに依存するのはなぜですか?
私が知っていることから、C ++のクラスのサイズは以下の要因に依存します- すべての非静的データメンバーのサイズ。 データメンバーの順序。 バイトパディングが有効かどうか。 直接の基本クラスのサイズ。 仮想機能の存在。 継承のモード(仮想継承)。 今私は以下のように2つのクラスを作成しました- class A{ int a; short s; int b; char d; };// kept a char at last on purpose to leave a "hole" class B : public A{ char c; }; AとBIのサイズを確認する Aのサイズ:16 Bのサイズ:16 私の仮定は、クラスBのchar cがクラスAに残された「穴」に収容されることです。 しかし、私を混乱させているのは、メンバーを公開する以下のシナリオです class A{ public: int a; …


8
サブクラス化:従来の属性でプロパティをオーバーライドすることは可能ですか?
報奨金は、期限が切れる2日間で。この質問への回答は、+ 500レピュテーションバウンティの対象となります。 ポールパンツァーは既存の答えに報いたいと考えています。 包括的な概念の異なる実装または特殊化であるクラスのファミリーを作成したいとします。いくつかの派生プロパティにもっともらしいデフォルト実装があると仮定しましょう。これを基本クラスに入れたい class Math_Set_Base: @property def size(self): return len(self.elements) したがって、サブクラスはこのかなりばかげた例でその要素を自動的に数えることができます class Concrete_Math_Set(Math_Set_Base): def __init__(self,*elements): self.elements = elements Concrete_Math_Set(1,2,3).size # 3 しかし、サブクラスがこのデフォルトを使用したくない場合はどうなりますか?これは動作しません: import math class Square_Integers_Below(Math_Set_Base): def __init__(self,cap): self.size = int(math.sqrt(cap)) Square_Integers_Below(7) # Traceback (most recent call last): # File "<stdin>", line 1, in <module> # File "<stdin>", line …

1
空の基本クラスもメンバー変数であるときに、空の基本最適化が禁止されているのはなぜですか?
空のベース最適化は素晴らしいです。ただし、次の制限があります。 同じ基本型の2つの基本サブオブジェクトはオブジェクト表現内で異なるアドレスを持つ必要があるため、空の基本クラスの1つが最初の非静的データメンバーの型の型または基本でもある場合、空の基本最適化は禁止されています。最も派生したタイプの。 この制限を説明するには、次のコードを検討してください。static_assert失敗します。一方、どちらFooかBarを変更するか、代わりにから継承するBase2と、エラーが回避されます。 #include <cstddef> struct Base {}; struct Base2 {}; struct Foo : Base {}; struct Bar : Base { Foo foo; }; static_assert(offsetof(Bar,foo)==0,"Error!"); 私はこの振る舞いを完全に理解しています。私が理解していないのは、この特定の動作が存在する理由です。見落としではなく明示的な追加であるため、明らかに理由で追加されました。これの根拠は何ですか? 特に、2つの基本サブオブジェクトが異なるアドレスを持つ必要があるのはなぜですか?上記のBarはタイプでfooあり、そのタイプのメンバー変数です。Barの基本クラスがのタイプの基本クラスと関係がある理由foo、またはその逆の理由がわかりません。 実際、私はどちらかと言えば、それを含むインスタンス&fooのアドレスと同じであることを期待しBarます。他の状況で必要になるためです(1)。結局のところ、私はvirtual継承についてBase2特別なことは何もしていません。基本クラスは関係なく空であり、を使用したコンパイルは、この特定のケースでは何も壊れないことを示しています。 しかし、明らかにこの推論はどういうわけか間違っており、この制限が必要になる他の状況があります。 答えがC ++ 11以降であるとしましょう(私は現在C ++ 17を使用しています)。 (1)注:EBOはC ++ 11でアップグレードされ、特にに対して必須になりましたStandardLayoutType(ただしBar、上記でははではありませんStandardLayoutType)。


3
enable_shared_from_thisを最初の基本クラスにする必要がありますか?
私のクラスは複数のベースから継承していますが、そのうちの1つはですstd::enable_shared_from_this。一塁でなければならないのですか? 次のコード例を考えてみます。 struct A { ~A(); }; struct B { ~B(); }; struct C : A, B, std::enable_shared_from_this<C> {}; std::make_shared<C>(); 実行する~A()と~B()、C住んでいたストレージがまだ存在していることを確認できますか?

1
using宣言でユーザー定義の変換テンプレートを参照することはできますか?
class Bから継承するクラスAでは、次のように、using宣言を使用してのメンバーAをB、さらにはテンプレートに含めることができます。 struct A { template <typename T> void foo(); }; struct B : private A { using A::foo; }; しかし、それは変換テンプレートに対して行うことができますか? struct A { template <typename T> operator T(); }; struct B : private A { using A::operator /* ??? */; }; テンプレートを名前で参照する方法はないようですが、間違っていることが判明するか、説明が必要です。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.