C++ 虚函数和继承:多态性示例解析
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
解析:
-
指针指向子类对象: 首先我们创建了一个指向B类对象的A类指针p。由于B类继承了A类,所以可以将B类对象赋值给A类指针。
-
调用虚函数: 当调用
p->funcl()时,由于funcl()被声明为虚函数,且在子类B中没有重新定义,因此编译器会根据指针p所指向的对象类型来动态绑定函数。由于p指向的是B类对象,所以调用的是A类中的funcl()函数,输出A1。 -
调用非虚函数: 当调用
p->func2()时,由于func2()不是虚函数,编译器不会进行动态绑定,而是根据指针p的类型来确定调用哪个函数。由于p的类型是A类,因此调用的是A类中的func2()函数,输出A2。
总结: 由于 funcl() 是虚函数,通过指针p调用它时会动态绑定到B类对象中的实现,而 func2() 不是虚函数,因此调用的是A类中的实现。最终输出为 A1B2。
原文地址: https://www.cveoy.top/t/topic/oLUM 著作权归作者所有。请勿转载和采集!