【正确答案】A 【解析】A * p = new B; // A 的指针指向 B 的对象。 当执行 new B 时,调用 B 的无参构造函数,由于 B 继承 A,所以先调用 A 的构造函数,在 A 的构造函数中调用了虚函数 bar(),这时调用的是 A 的 bar()。如果在构造函数或析构函数中调用虚函数,则运行的是为构造函数或析构函数本人类型定义的版本,因为在构造子类的时候,首先回去调用父类的默认构造函数,此时子类还是未初始化的,所以不可能调用子类函数; p->foo(); 因为 foo() 不是虚函数,所以执行的是 A 的 foo();
在这段代码中,当执行 A *p = new B; 时,发生了多态性。尽管 p 的静态类型是 A*,但动态类型是 B。因此,当调用 p->foo() 时,由于 foo 不是虚函数,所以会根据指针的静态类型 A* 调用 A 类中的 foo 函数,输出为 "foo";而调用 p->bar() 时,由于 bar 是虚函数,会根据动态类型 B 调用 B 类中的 bar 函数,输出为 "b_bar"。
【解析】A * p = new B; // A 的指针指向 B 的对象。
当执行 new B 时,调用 B 的无参构造函数,由于 B 继承 A,所以先调用 A 的构造函数,在 A 的构造函数中调用了虚函数 bar(),这时调用的是 A 的 bar()。如果在构造函数或析构函数中调用虚函数,则运行的是为构造函数或析构函数本人类型定义的版本,因为在构造子类的时候,首先回去调用父类的默认构造函数,此时子类还是未初始化的,所以不可能调用子类函数;
p->foo(); 因为 foo() 不是虚函数,所以执行的是 A 的 foo();
【静态联编和动态联编知识点讲解】
更多C++基础专业知识讲解,点击链接即可查看
https://www.nowcoder.com/link/zxyl-cpp89