摘要:
A()B()~A() 可以看到这种情况下,非虚函数的话,B被当做A看待,只调用了A的析构函数。 如果加上virtual,就会不一样了。 调用过程变成: A() B() ~B() ~A() 为什么这么说,因为首先,这是多态,那么会调用B的析构函数。 同时,因为是析构,所以一定会调用到父类的析构函数。? 阅读全文
摘要:
class D:public C{ public: D(){cout << "D()" << endl;} virtual ~D(){ cout << "~D()"<<endl;} }; class E:public D{ public: E(){cout << "E()" << endl;} virtual ~E(){ cout... 阅读全文
摘要:
A::get_p() 说明,成功的调用了 阅读全文
摘要:
func ptr is 8 int ptr is 44197204 4197218 4197232 4197282 4197296 4197232 可以看到,第一个和第二个不一致,第三个是一样的。 阅读全文
摘要:
1、严格上说,必须与原来的类型是完全相同的 2、放宽一些,可以返回 原来的返回的类型的 子类的指针或引用。 比如 但是,协变类型也是可以接受的。仅仅是子类的 指针 或 引用。 同时需要注意,返回值可以是协变,但是传入的参数不能协变。 阅读全文
摘要:
只有用指针和引用,才会动态绑定。才会在运行时候从虚表中找对应的成员函数。 如果只是用.访问成员函数,是静态绑定,在编译时刻就固定好的。 另外,父类的虚函数,子类不管加不加virtual关键字,都是虚函数。最好加上。 同样的,用指针和引用,访问普通函数的时候,不会发生多态。多态的两个条件,缺一不可。 阅读全文
摘要:
B*这个类型会被当成A*来访问。所以调用的是A的print。 因为这个寻址,不是用虚表寻址,而是编译器做的静态绑定。 阅读全文
摘要:
把子类中仅仅继承而来的成员,赋值给父类。 但是,不会改变虚表!因为这个obj的类型没变。 阅读全文
摘要:
可以看到,A类的结构就是一个内存里面存了一个i,没有其他多余的东西。 B类在继承的基础上自己定义了一个j,实现中也就是在i后面追加了一个j。 阅读全文