结合高赞解析,总结下我的理解,不知道对不对,如果有问题,请评论指出。谢谢!
Base* base = new Derived();
1、上述语句首先定义了一个Base指针,指向一个Derived子类对象(此时该对象还没有被new出来);然后new一个Derived子类对象;
2、该Derived子类对象首先调用基类Base的构造函数(输出Base),初始化基类的数据成员;
然后再来调用Derived子类自己的构造函数初始化子类数据成员(输出Derived)。(整个过程就是这么规定的)。
3、
base->echo();
该过程被调用的函数取决于用来调用函数的句柄,而不是句柄所指向的类型。
该句柄是一个Base基类的指针,因为通过基类的指针或者引用调用了虚函数,此时发生了动态绑定,原则上会访问基类Base的虚函数echo(),但是由于派生类的虚函数覆盖/隐藏了基类的虚函数,所以最终该句柄调用的是派生类Derived的echo()虚函数(输出Derived)。
关于动态绑定
运行过程中的多态要满足三个条件:
1、类之间满足赋值兼容规则。
2、声明了虚函数。
3、由成员函数来调用或者是通过指针或引用来访问虚函数。
对于划线的部分,我不太确定,直接修改代码进行了验证,如果echo不是虚函数,那么结果应该是 Base Derived Base
#include <cstdio>
using namespace std;
class Base {
public:
Base() {
echo();}
/*virtual */void echo() {
printf("Base\n");}
};
class Derived:public Base {
public:
Derived() {
echo();}
/*virtual */void echo() {
printf("Derived\n"