派生类中重定义函数与虚函数应用的区别!
我是C++的新手.近来看到了虚函数这一块.想到以前看到的派生类中的重定义函数.感觉两者功能差不多.但我知道虚函数肯定有很多优越的地方,那位能指点指点我,告诉我两者的其区别么?谢谢!! 问题点数:20、回复次数:9Top
1 楼sky_blue(蓝天2007)回复于 2003-11-04 19:12:43 得分 0
虚函数更容易抽象。Top
2 楼carbon107(<软件开发思想.h>)回复于 2003-11-04 19:15:26 得分 10
虚函数是C++中用于实现多态(polymorphism)的机制。核心理念就是通过基类访问派生类定义的函数。假设我们有下面的类层次:
class A
{
public:
virtual void foo() { cout << "A::foo() is called" << endl;}
};
class B: public A
{
public:
virtual void foo() { cout << "B::foo() is called" << endl;}
};
那么,在使用的时候,我们可以:
A * a = new B();
a->foo(); // 在这里,a虽然是指向A的指针,但是被调用的函数(foo)却是B的!
这个例子是虚函数的一个典型应用,通过这个例子,也许你就对虚函数有了一些概念。它虚就虚在所谓“推迟联编”或者“动态联编”上,一个类函数的调用并不是在编译时刻被确定的,而是在运行时刻被确定的。由于编写代码的时候并不能确定被调用的是基类的函数还是哪个派生类的函数,所以被成为“虚”函数。
虚函数只能借助于指针或者引用来达到多态的效果,如果是下面这样的代码,则虽然是虚函数,但它不是多态的:
class A
{
public:
virtual void foo();
};
class B: public A
{
virtual void foo();
};
void bar()
{
A a;
a.foo(); // A::foo()被调用
}
重定义函数功能可没有虚函数强,你想想是不是这回事啊Top
3 楼yuantao(cfan)回复于 2003-11-04 22:25:30 得分 0
楼上的说的很对,虚拟是c++类继承的基础
重载其实就是为了方便点使用,使功能类似的方法可以用一个名字表示Top
4 楼fifo2003(o奇迹再现o)回复于 2003-11-05 21:05:18 得分 0
up
Top
5 楼hezhipei1182(何)回复于 2003-11-05 21:11:39 得分 0
好像是!
当你使用派生类指针指向父类的时候,只有虚函数才可以正确的调用相应的实现Top
6 楼hezhipei1182(何)回复于 2003-11-05 21:19:02 得分 0
说错了,是基类指针指向派生类时,正如 carbon107(<软件开发思想.h>)所说Top
7 楼tianxueshan(tianxueshan)回复于 2003-11-06 14:19:21 得分 10
首先要说明的是。C++的编译器比C的更严格。在继承中除了同一作用域的函数重载。
如:
class A
{
public:
void g(int);
void g(float);
};
这时重载。
在C++中有隐藏。重载。覆盖等概念。
当:
class B:public A
{
public:
void g();
};
这时B中的成元函数只是覆盖了A类
中的f()当然B中g()不是重载了A类的成
员函数。因为不是相同的作用域。
隐藏就是虚函数的概念,当然要想完全了解虚函数的机制还得
了解其内部的机制。这也并非三言两语说得清的。
Top
8 楼qybei(qybei)回复于 2003-11-07 18:04:24 得分 0
建议你看一下《Effective C++》,里面讲有很多这方面的细节,很好的Top
9 楼hafent(大海扬波)回复于 2003-11-20 21:05:05 得分 0
嗯,支持 carbon107(<软件开发思想.h>) (Top




