虚函数与派生类重载

本文探讨了C++中虚函数与重载的区别,重点解释了派生类中如何通过重写来改变基类虚函数的行为,以及如何通过重载创建新的函数。文章通过实例展示了重载对基类成员函数的影响。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

虚函数很简单,之前转载了人家的一片不错的文章就是关于虚函数的

这里不讲虚函数的定义了

直接进入主题,就是重载。

如果基类声明了一个函数是虚函数,而且派生类并没有改变参数,只是把函数内容改变了,那么这个可以认为是“重写“

派生类重载是什么呢,就是在派生类中仅仅保留基类的函数名,参数变了,或者返回类型也变了,如果不改变参数仅仅改变返回类型不是重载,这样也是错的。

如果重载了,你就不会得到基类对应的函数名的函数了,被隐藏了!

除非你使用基类作用域解析符号,要不你调用基类版本就是错误的!

看例子:


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类里面没有这么个函数类型啊,很简单,虚拟函数只对基类里面定义了的才算,不能理解成基类里面一个定义了,其他的也变成了虚拟的了,这样是不对的。

这里就有一个建议,如果重载了基类的函数,最好是把基类的虚函数都重写在派生类里面一次,就不会隐藏基类的函数方法了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值