虚函数很简单,之前转载了人家的一片不错的文章就是关于虚函数的
这里不讲虚函数的定义了
直接进入主题,就是重载。
如果基类声明了一个函数是虚函数,而且派生类并没有改变参数,只是把函数内容改变了,那么这个可以认为是“重写 “
派生类重载是什么呢,就是在派生类中仅仅保留基类的函数名,参数变了,或者返回类型也变了,如果不改变参数仅仅改变返回类型不是重载,这样也是错的。
如果重载了,你就不会得到基类对应的函数名的函数了,被隐藏了!
除非你使用基类作用域解析符号,要不你调用基类版本就是错误的!
看例子:
class C0
{
public:
virtual void Set1(int i)
{
cout <<"C0:Set1 i=" <<i <<endl;
}
/****found*****/
virtual void Set2(int i)
{
cout <<"C0:Set2 i=" <<i <<endl;
}
};
class C1:public C0
{
public:
int Set1(string i)
{
cout <<"C1:Set1 i=" <<i <<endl;
return 9;
}
void Set2(int i)
{
cout <<"C1:Set2 i=" <<i <<endl;
C0::Set2(i);
}
};
void main()
{
C0 *p;
C1 obj2;
obj2.Set1(1); //这里就出错了
obj2.Set2(2);
/*******found*****/
p = &obj2;
p-> Set1(3);
p-> Set2(4);
return;
}
上面指示的地方就出错了,因为派生类的重载直接隐藏了基类的函数,而且继承作用暂时失效,如果你要使用基类的方法就是这样:obj2.C0::Set1(1); 加上作用域解析符。
有人问:p-> Set1(3);这里为什么不出错啊,c1类里面没有这么个函数类型啊,很简单,虚拟函数只对基类里面定义了的才算,不能理解成基类里面一个定义了,其他的也变成了虚拟的了,这样是不对的。
这里就有一个建议,如果重载了基类的函数,最好是把基类的虚函数都重写在派生类里面一次,就不会隐藏基类的函数方法了
!