C++ 虚函数和继承:多态性示例解析

问题: 以下程序运行后,屏幕上将显示输出?()

#include<iostream>
using namespace std;
class A {
	public:
	virtual void funcl() {
		cout'A1';
	}
	void func2() {
		cout'A2';
	}
};
class B:public A {
	public:
	void func1() {
		cout'B1';
	}
	void func2() {
		cout'B2';
	}
};
int main() {
	A *p=new B;
	p->funcl();
	p->func2();
	return 0;
}

答案: D. A1B2

解析:

  1. 指针指向子类对象: 首先我们创建了一个指向B类对象的A类指针p。由于B类继承了A类,所以可以将B类对象赋值给A类指针。

  2. 调用虚函数: 当调用 p->funcl() 时,由于 funcl() 被声明为虚函数,且在子类B中没有重新定义,因此编译器会根据指针p所指向的对象类型来动态绑定函数。由于p指向的是B类对象,所以调用的是A类中的 funcl() 函数,输出 A1

  3. 调用非虚函数: 当调用 p->func2() 时,由于 func2() 不是虚函数,编译器不会进行动态绑定,而是根据指针p的类型来确定调用哪个函数。由于p的类型是A类,因此调用的是A类中的 func2() 函数,输出 A2

总结: 由于 funcl() 是虚函数,通过指针p调用它时会动态绑定到B类对象中的实现,而 func2() 不是虚函数,因此调用的是A类中的实现。最终输出为 A1B2


原文地址: https://www.cveoy.top/t/topic/oLUM 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录