重写pk重载理解区分

重写 PK 重载理解

函数重载

必须在同一个类中进行

子类无法重载父类的函数,父类同名函数将被名称覆盖

重载是在编译期间根据参数类型和个数决定函数调用

函数重写

必须发生于父类与子类之间

并且父类与子类中的函数必须有完全相同的原型

使用virtual声明之后能够产生多态(如果不使用virtual,那叫重定义)

多态是在运行期间根据具体对象的类型决定函数调用

重写的两种情况
如果函数重写,在父类中增加了virtual关键字, 将能产生多态。。。。
如果函数重写,没有加virtual关键字,,相当于在子类中重定义。。。。。,不会发生多态。。。
子类和父类有相同的名字(变量名字或者是函数名字的时,子类名字覆盖父类名字,如果想使用父类的资源,需要加::)

下面来看这个例子
我提出几个问题
child对象继承父类对象的func,请问这句话能运行吗?why
c.func(); 
问题2 子类的两个func和父类里的三个func函数是什么关系?


#include <cstdlib>
#include <iostream>

using namespace std;

class Parent01
{
public:
	Parent01()
	{
		cout << "Parent01:printf()..do" << endl;
	}
public:
	void func()
	{
		cout << "Parent01:void func()" << endl;
	}

	void abcd()
	{
		cout << "Parent01:void func()" << endl;
	}

	virtual void func(int i)
	{
		cout << "Parent:void func(int i)" << endl;
	}

	virtual void func(int i, int j)
	{
		cout << "Parent:void func(int i, int j)" << endl;
	}
};


//重写的两种情况
//如果函数重写,在父类中增加了virtual关键字, 将能产生多态。。。。
//如果函数重写,没有加virtual关键字,,相当于在子类中重定义。。。。。,不会发生多态。。。
class Child01 : public Parent01
{

public:

	
	void abcd(int a, int b)
	{
		cout << "Parent01:void func()" << endl;
	}

	//此处2个参数,和子类func函数是什么关系
	void func(int i, int j)
	{
		cout << "Child:void func(int i, int j)" << " " << i + j << endl;
	}

	//此处3个参数的,和子类func函数是什么关系
	void func(int i, int j, int k)
	{
		cout << "Child:void func(int i, int j, int k)" << " " << i + j + k << endl;
	}
};

void run01(Parent01* p)
{
	p->func(1, 2);
}

int ma11111in()
{
	Parent01 p;

	p.func();
	p.func(1);
	p.func(1, 2);


	Child01 c;
	//c.Parent01::abcd(); //这个函数是从父类中继承而来 可以使用。。。
	//子类和父类有相同的名字(变量名字或者是函数名字的时,子类名字覆盖父类名字,如果想使用父类的资源,需要加::)
	c.Parent01::func(); //问题1 这个函数是从父类中继承而来,为什么这个地方不能使用
	//c.func(); //问题1
	//c.func(1, 2);
	/*
	run01(&p);
	run01(&c);
	*/
	system("pause");
	return 0;
}

1子类里面的func无法重载父类里面的func 
2.当父类和子类有相同的函数名、变量名出现,发生名称覆盖
也就是是说发生了 名称覆盖,把子类中的没有函数参数的,这个函数abcd名称覆盖了。。。
在子类中,是不能重载父类的函数的。编译器就是这么做的,顺从。。。。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值