C ++中的简单继承

时间:2012-09-27 18:23:13

标签: c++ inheritance

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

3 个答案:

答案 0 :(得分:4)

  

为什么B类的getdata()被称为??

因为b1B类型的对象。

根据调用它们的变量的静态类型解析非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相反) 您必须使用“虚拟”键声明函数才能实现多态性