在给定的程序中,类B继承了类A,并且在类B的main()对象中创建并调用了getdata()函数,为什么要调用类B的getdata()??
class A {public: void getdata() { cout<<"Class A"; } };
class B: public A { public: void getdata() { cout<<"Class B"; } };
void main() { B b1; b1.getdata(); }
答案 0 :(得分:4)
为什么B类的getdata()被称为??
因为b1
是B
类型的对象。
根据调用它们的变量的静态类型解析非virtual
成员函数。
在您提供的案例中,调用getdata()
的变量为b1
,其类型为B
。因此,B::getdata()
被调用。
在您提供的链接http://www.tutorialspoint.com/cplusplus/cpp_polymorphism.htm中,area
通过Shape*
类型的指针调用,因此调用了Shape::area()
。
还要考虑这个程序:http://ideone.com/KVjN3
#include <iostream>
class A {public: void getdata() { std::cout<<"Class A\n"; } };
class B: public A { public: void getdata() { std::cout<<"Class B\n"; } };
int main() { B b1; b1.getdata(); A* pa = &b1; pa->getdata(); }
输出:
Class B
Class A
这与您的计划非常相似。 getdata()
的第一次调用是B
,因此会调用B::getdata()
。第二个是通过A*
,因此调用了A::getdata()
。
但是,如果您提供virtual
关键字,则所有这些都会发生变化。
答案 1 :(得分:2)
因为b1
被静态声明为B
类型的变量。
请注意,在这种情况下,由于上面写的原因,getdata()
不是虚拟的这一事实无关紧要。
答案 2 :(得分:0)
C ++对象本质上不是多态的(与Java相反) 您必须使用“虚拟”键声明函数才能实现多态性