在给定的程序中,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(); }
在给定的程序中,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(); }
为什么调用 B 类的 getdata()?
因为b1
是类型的对象B
。
非virtual
成员函数根据调用它们的变量的静态类型来解析。
在您给出的情况下,调用的变量getdata()
是b1
,它的类型是B
。因此,B::getdata()
被调用。
在您提供的链接中,http://www.tutorialspoint.com/cplusplus/cpp_polymorphism.htm是area
通过 type 的指针调用的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()
是通过 a B
,因此B::getdata()
被调用。第二个是通过一个A*
,因此A::getdata()
被调用。
但是,如果您提供virtual
关键字,所有这些都会改变。
因为b1
被静态声明为类型的变量B
。
请注意,在这种情况下,由于上面写的原因,不是虚拟的事实getdata()
是不相关的。
C++ 对象本质上不是多态的(与 Java 不同)。
您必须使用“虚拟”键声明函数才能实现多态性