#include <bits/stdc++.h> using namespace std; class A { public: A() { cout << "构造A" << endl; s = new char[20]; memset(s, 0, 20); strcpy(s, "hahaha"); } virtual ~A() { cout << "析构A" << endl; delete []s; } virtual void print() { cout << s << endl; } private: char *s; }; class B : public A { public: B() { cout << "构造B" << endl; s = new char[20]; memset(s, 0, 20); strcpy(s, "BBBBB"); } virtual ~B() { cout << "析构B" << endl; delete []s; } virtual void print() { cout << s << endl; } private: char *s; }; void ok(A *obj) { obj->print(); } void okk(A obj) { obj.print(); }
1.
int main() { B *b = new B; A *obj = b; obj->print(); delete b; /*构造A 构造B BBBBB 析构B 析构A*/ }
2.
int main() { B *b = new B; A *obj = b; obj->print(); delete obj; /*构造A 构造B BBBBB 析构A*/ }
3.
int main() { B b; A a = b; A *pa = &b; a.print();//这里的a就是一个A类型的变量,它的内存布局在赋值的时候已经从B转换到A了,多于的数据都被丢弃,因此其就是一个A类型的变量。 pa->print();//其是一个指针,其类型虽然是A,但指向的区域的内容却是一个B类型的内存结构,虽然内存结果的布局与A兼容,但其虚函数表中的Test却是B的实现 /*构造A 构造B hahaha BBBBB 析构A 析构B 析构A*/ }
4.
int main() { B *b = new B; ok(b); /*构造A 构造B BBBBB*/ }
5.
int main() { B *b = new B; ok(b); delete b; /*构造A 构造B BBBBB 析构B 析构A*/ }
6.
int main() { B b; okk(b); /*构造A 构造B hahaha 析构A 析构B 析构A*/ }
7.
int main() { B *b = new B; A a; b = &a; //报错,不能让子类指针指向父对象 ok(b); }