简述如果ClassA中定义并实现虚函数int func(void),ClassB中也实现该函数,那么上述变量a->func()将调用哪个类里面的函数?如果int func(void)不是虚函数,情况又如何?为什么 ?
参考答案:
当ClassA
中定义并实现了一个虚函数int func(void)
,而ClassB
从ClassA
继承并且也实现了该函数,那么对于ClassB
的一个对象a
,a->func()
将调用ClassB
中实现的func
函数。这是多态性的一个核心特征,即运行时动态绑定。当通过基类指针或引用调用虚函数时,实际调用的是指针或引用所指向对象所属类中的实现。
如果int func(void)
不是虚函数,那么情况就不同了。在这种情况下,a->func()
将总是调用ClassA
中的func
实现,不论a
的实际类型是什么。这是因为非虚函数在编译时就已经绑定到了它们的实现,而不是在运行时。因此,通过基类指针或引用调用非虚函数时,实际调用的是基类中的实现。
总的来说,虚函数允许实现多态性,即通过基类指针或引用可以调用派生类中的实现,而非虚函数则总是调用基类中的实现。