c++中基类指针指向派生类时,调用的虚函数是派生类的,为什么要这样啊?

我觉得可以不用虚函数,调用时直接用派生类的对象就行了,哪位能告诉我设计虚函数的真正意图?

直接用子类对象调用函数当然没问题,基类指针指向派生类对象是多态性的体现。
什么是多态呢?多态就是不同对象接受相同的消息,但是却产生不同的行为,举一个很简单的例子,有一个图形类,他有几个派生类,如圆形,三角形,矩形。图形类有一个函数area();用来求面积,但是由于不同图形求面积的方法不同,要由具体的派生类来决定,所以可以把它定义为一个虚函数,由派生类来重载这个函数,所以不同的派生类里面area()函数的函数体是不同的,
创建一个基类指针*p,让他指向不同的派生类对象,p在调用area()方法时,就会调用派生类的area()方法了。
多态的一个好处就是提高了代码的重用性,如果图形类又有一个新的派生类五边形,要求他的面积只需要把刚才的p指针再指向一个五边形对象,而其他的代码无需任何更改!
在附上例子吧!
class shape
{ public:
virtual int area();
}
class circle: public shape
{
virtual int area()
{
...
}
}
class triangle: public shape
{
virtual int area()
{
...
}
}
class rectangle: public shape
{
virtual int area()
{
...
}
}

int main()
{
shape *p;
circle c;
triangle t;
rectangle r;
p=&c;
p->area();//调用circle的area();
p=&t;
p->area();//调用triangle的area();
p=&r;
p->area();//调用rectangle的area();
}
只是大概意思,供参考。
温馨提示:内容为网友见解,仅供参考
第1个回答  2008-05-21
虚函数的作用是: 在调用函数时再确定调用哪个对象的函数.
如果对象是被初始化为子类的, 就调用子类的函数; 如果对象是被初始化为父类的, 就调用父类的函数.
第2个回答  2008-05-21
直接用派生类的对象是可以的。但是虚函数的作用体现在多态上。

比如类A是个基类,类B,C,D由类A继承。

现在我要写个函数func1,对BCD三个类的对象都通用,函数内部调用BCD三个类都有的一个函数func2。

但是BCD三个类是不同的类,那么这个函数可能就要重载三次,写成

func1(B b){b.func2};
func1(C c){c.func2};
func1(D d){d.func2};

这样才能区分传进去的是哪个类的对象在调用func2,这样在继承得多了的时候显得很麻烦。虚函数多态就可以解决这样的问题。
把func2在类A中定义成虚函数,然后只要写一个func1

func1(A *a);
此时传B *b,C *c,D *d三个指针对象进去,都可以相应的调用各自的func2了。这是面向对象思想的一个体现
相似回答