1

在给定的程序中,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(); }
4

3 回答 3

4

为什么调用 B 类的 getdata()?

因为b1是类型的对象B

virtual成员函数根据调用它们的变量的静态类型来解析。

在您给出的情况下,调用的变量getdata()b1,它的类型是B。因此,B::getdata()被调用。

在您提供的链接中,http://www.tutorialspoint.com/cplusplus/cpp_polymorphism.htmarea通过 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关键字,所有这些都会改变。

于 2012-09-27T18:25:35.107 回答
2

因为b1被静态声明为类型的变量B

请注意,在这种情况下,由于上面写的原因,不是虚拟的事实getdata()是不相关的。

于 2012-09-27T18:25:53.883 回答
0

C++ 对象本质上不是多态的(与 Java 不同)。
您必须使用“虚拟”键声明函数才能实现多态性

于 2012-09-27T18:25:45.703 回答