编辑:代码都不是我的,都是给我的,我只是从对象分配方法的角度分析它。
我在内存分配方面遇到了很大的困难。我向你保证,在过去的 5 个小时里,我已经在这里查看了一百个示例。我知道这可能措辞不当,我提前道歉。
1.) 我不明白为什么第 2 版打印的是 A 类的 f() 而不是 B 类的。线
A* objA1 = objB;
正在声明一个指针 objA1,它指向 A 类型的对象,并将其地址分配给 objB 指向的位置 B(2,3)。我读过这句话“如果它们是堆动态对象,那么你可以将 b1 分配给 a1”。当我调用 objA1->f() 时,我只是说去这个位置,哦,你找到了 B 吗?将其转换为 A 并调用 f()。
2.) 我会认为版本 1 切片 objB,因为它是说设置这个已经为 A 分配空间的对象,等于更大的 B。但是如果我把 cout << objB.bf; 在此分配之后,它仍然有效。是 A objA1 = objB; 不是静态声明 objA1?再一次,为什么不打印 B 的 f()?
3.) 两个 objA1 分配有什么区别?至于什么功能只能与两者之一一起使用。如果你想给它一个过时的分类,你能称之为“堆动态”吗?
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();
}