C++中的简单继承



在给定的程序中,class B继承了class A,并且在class B的main()中创建了对象并调用了getdata()函数,为什么要调用class 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,通过类型为Shape*的指针调用area,因此,调用Shape::area()

还可以考虑此程序:http://ideone.com/KVjN3

#include <iostream>
class A {public: void getdata() { std::cout<<"Class An"; } };
class B: public A { public: void getdata() { std::cout<<"Class Bn"; } };
int main() { B b1; b1.getdata(); A* pa = &b1; pa->getdata(); }

输出:

Class B
Class A

它与您的程序非常相似。getdata()的第一次调用是通过B,因此调用B::getdata()。第二个是通过A*,因此调用A::getdata()

但是,如果提供virtual关键字,所有这些都会发生变化。

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

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

C++对象本质上不是多态的(与Java相反)
为了实现多态性,您必须用"虚拟"键声明函数

最新更新