c++什么是虚函数,构造与析构函数可以是虚函数吗?

来源:百度知道 编辑:UC知道 时间:2024/06/20 15:04:46
虚函数是不是只是在类里用来区分基类和派生类函数的区别》??

虚函数用于实现类的继承所体现的多态性,当一个类的成员函数被声明为虚的,那么这个类的派生类如果重载了这个函数,那么在调用这个函数时,会先确认这个类实例是原来的类还是派生类(因为父类的指针可以指向子类)如果是父类,那么调用父类的版本,如果是子类,则调用对应的子类的版本。
class A
{
public:
virtual void f(){cout<<"A::f()"};
};

class B :public A
{
public:
virutal void f(){cout<<"B::f()"}
};
int main()
{
A *p;
int i;
cin>>i;
if(i==0)
{
p=new A;
}
else
{
p=new B;
//虽然p是A类型的指针,但B是A的派生类,所以这样是合法的
//就好像人有男人女人之分,他们是人派生出来的,不关男
//人还是女人,都是人这一个范畴
}
p->f();
//当你输入0时指针p指向一个A类型的变量,所以调用的是A::f()
//当你输入非0时,指针p指向一个B类型的变量,所以调用的是B::f()
//这就是虚函数奇妙之所在,一般函数是作不到的,对于一般的函数调用
//的函数在编译时就确定了。假如f是非虚函数,那么永远调用的是A::f()
//因为p是A*类型
return 0;
}

构造函数不能是虚函数,而析构函数在某些情况下必须为虚函数(比如你想让你类能够被继承,那么这个类的析构函数最好是虚的,继承一个析构函数不是虚的类是有风险的),值得补充的是,当基类的函数是虚函数,子类的重载的函数也是虚的,及时不加virtual关键字也是虚的。

非也 非也,虚函数是与函数重载区分的,虚函数