为什么 C++ 中,基类指针可以指向派生类对象?
原因是这样的:
在内存中,一个基类类型的指针是覆盖N个单位长度的内存空间。
当其指向派生类的时候,由于派生类元素在内存中堆放是:前N个是基类的元素,N之后的是派生类的元素。
于是基类的指针就可以访问到基类也有的元素了,但是此时无法访问到派生类(就是N之后)的元素。
作者:浮生空
链接:https://www.zhihu.com/question/25572937/answer/34439248
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
纯虚拟函数:
C++明确指出,当子类对象经由一个父类指针被删除,而该父类带有一个non-virtual析构函数,其结果未定义--实际执行时通常发生的是对象的derived成分没有被销毁。子类的析构函数也未能被执行。然而其base class成分通常会被销毁,于是造成了诡异的“局部销毁”对象。这可能造成资源泄露,败坏数据结构等
引自https://blog.youkuaiyun.com/wangzengdi/article/details/30028013
2018/3/18
1.发现用一个类的对象去初始化另一个对象时,不会调用构造函数,但是这个对象是确实存在的,而不是仅仅传地址,因为在程序结束时两个对象的析构函数都被调用了,原因目前还不清楚;
2.若类的某个函数是const类型的(并非返回值const,而是函数体const),那么在函数体内调用的其他成员函数也必须是const类型的,否则无法保证不更改函数成员属性;
3.类的函数声明后边加上 “= 0”表示纯虚函数,一个含有纯虚函数的类是抽象类,无法被初始化为对象,只能被继承,如virtual int han() const =0; ("const"和" = 0"要分开理解);
4.若子类继承了父类的某一个函数,并重新定义了该函数,若该函数不是虚函数,则会在编译时确定具体执行哪一个(子类的还是父类的,静态绑定),比如用一个父类的指针指向子类的对象,再通过该指针调用覆盖了的非虚函数,则会执行父类的函数实现,但是若是直接初始化了一个子类的对象,用这个对象名(reference)去调用这个函数,就会执行父类的函数实现;但是如果该函数是虚函数,则会在执行时确定(动态绑定),即使是用父类的指针指向子类的对象,执行这个函数时仍然会执行子类的函数实现。