虚函数的重载和重新定义

对于虚函数的重载,若在派生类中仅改变函数返回值,则编译器不允许!(这与非虚函数不同,非虚函数在派生类中若只改变返回值,是允许的,且隐藏基类的所有同函数名的版本)
    其他情况则和非虚函数相同,只要派生类中对基类虚函数重新定义(函数体改变或参数类型或参数个数改变),基类的所有同函数名的重载版本均被隐藏,只有派生类中的重新定义的版本可直接使用!
#include <iostream>
#include <string>
#include <stdlib.h>
using namespace std;

class Base 
{
	
public:
	Base(){}
	
	virtual void func(string) const{
		cout<<"Base::func()\n";
	}
	virtual int func() const {cout<<"Base"<<endl;return 1;}
};


class Derive1 : public Base
{
public:  
	Derive1(){}
	//对Base中func override
	int func() const{
		cout<<"Derive1::func()\n";
		return 1;
	}
};

class Derive2 : public Base
{
public:  
	Derive2(){}
	// !!! 重写虚函数返回类型有差异,且不是来自“Base::func”的协变
	// !!! 只改变返回类型是不符合重写的!编译不通过
	//!!! string func(string)const {cout<<"Derive2"<<endl;}
};

class Derive3 : public Base
{
public:  
	Derive3(){}
	//对func重新定义,参数列表变化
	int func(int )const {cout<<"Derive3"<<endl; return 1;}
};


int main()
{
	Derive1 d1;

	d1.func();
	//!!! d1.func("123");   // Derive1对Base中的func override(覆盖)了,Base中所有重载版本都会被隐藏。
	
	//显示调用基类的成员函数
	
	d1.Base::func("123");  //不是覆盖了基类的func吗?为什么还能调用?Derive1虚表中有<span style="font-family:宋体;">三</span>个func? ?????
	d1.Base::func();  // ?????
	Derive2 d2;

	Derive3 d3;
	d3.func(1);
	//!!! d3.func();   //Derive3中对func进行了重新定义(参数列表改变),基类的func的所有重载函数均被隐藏,不能调用func() 和func(string)
	// !!! d3.func("123");
	//
	d3.Base::func();  
	d3.Base::func("123");
	system("pause");
	return 0;
}

 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值