編集:コードはどれも私のものではなく、すべて私に与えられたものであり、オブジェクト割り当てメソッドの観点から分析しているだけです。
私はメモリ割り当てに本当に苦労しています。過去5時間にここで100の例を見てきたことをお約束します。これはおそらく言葉遣いが悪いことを理解しており、事前にお詫び申し上げます。
1.)バージョン2がクラスBの代わりにクラスAのf()を出力する理由がわかりません。この線
A* objA1 = objB;
タイプAのオブジェクトを指すポインタobjA1を宣言し、そのアドレスをobjBが指している場所B(2,3)に割り当てています。「ヒープダイナミックオブジェクトの場合は、b1をa1に割り当てることができます」という文を読みました。objA1-> f()を呼び出すとき、私は単にこの場所に行くと言っているのですか、ああ、Bを見つけましたか?それをAにキャストし、f()を呼び出します。
2.)バージョン1のスライスされたobjBを考えたのは、Aのスペースが割り当てられたこのオブジェクトを、大きい方のBに等しく設定すると言っているからです。しかし、私がcout << objB.bf; この割り当ての後、それはまだ有効です。はAobjA1= objB; objA1を静的に宣言していませんか?そしてもう一度、なぜこれはBのf()を出力しないのでしょうか?
3.)2つのobjA1割り当ての違いは何ですか?どの機能が2つのうちの1つでのみ機能するかと同じです。ある種の古い分類を与えたい場合は、両方を「ヒープダイナミック」と呼ぶことができますか?
class A {
private:
int a;
public:
A(int ia) {a = ia;}
void f() {
cout << "Call to method f defined in class A" << endl;
}
};
class B : public A {
private:
int b;
public:
B(int ia, int ib) : A(ia) {b = ib;}
void f() {
cout << "Call to method f specialized in class B" << endl;
}
void bf() {
cout << "Call to class B own method bf" << endl;
}
};
// C++ driver - Version 1
void main() {
A objA = A(1);
B objB = B(2,3);
objA.f();
objB.f();
objB.bf();
A objA1 = objB;
objA1.f();
}
// C++ driver - Version 2
void main() {
A* objA = new A(1);
B* objB = new B(2,3);
objA->f();
objB->f();
objB->bf();
A* objA1 = objB;
objA1->f();
}