同名函数的三种关系(重载,隐藏,覆盖)

1.重载

  • 函数名相同
  • 作用域相同
  • 函数参数不同
class Base
{
public:
	//这两个函数构成重载
	void show()
	{
		cout << "Base::void show()" << endl;
	}
	void show(int i)
	{
		cout << "virtual void show(int i )" << endl;
	}

};

这两个函数就构成了重载,在相同的作用域内,函数名相同,参数不同

2.隐藏

隐藏很简单,就是派生类中的函数会隐藏基类中同名的函数,无关其他

class Base
{
public:
	void show()
	{
		cout << "Base::void show()" << endl;
	}
};

class Derive :public Base
{
	//隐藏父类中的void show函数
public:
	void show()
	{
		cout << "Derive::void show()" << endl;
	}

};

隐藏发生后,父类还是调用父类的函数,子类还是调用子类的函数

3.覆盖

  • 基类和派生类中的函数同名,同参数
  • 基类中的函数是虚函数
  • 派生类中的同名同参的函数覆盖了基类中同名同参的虚函数
class Base
{
public:
	//这两个函数构成重载
	virtual void show()
	{
		cout << "Base::void show()" << endl;
	}
	void show(int i)
	{
		cout << "virtual void show(int i )" << endl;
	}
};

class Derive :public Base
{
	//隐藏父类中的void show函数
public:

	void show()
	{
		cout << "Derive::void show()" << endl;
	}
};

int main()
{
	Base *base = new Derive();
	base->show();

	return 0;
}

定义一个基类的指针指向子类的对象,调用show函数的时候派生类会把基类的show函数覆盖,所以调用的是派生类的

面试点

1.派生类继承了基类的什么?

我们通过下面一段代码看一下

#include<iostream>
#include<string>


class People
{
public:
	People(std::string name, int age, bool sex)
		:mname(name), mage(age), msex(sex){}
	void eat()
	{
		std::cout << mname << " can eat !" << std::endl;
	}
	static int ma;
	void Show()
	{
		std::cout << "hello world!" << std::endl;
	}
	typedef int Elem_Type;
protected:
	std::string mname;  //28
	int mage;  // 4
	bool msex; // 4

};
int People::ma = 10;   //静态的成员变量需要在类外初始化

class Student : public People
{
public:
	Student(std::string name, int age, bool sex, std::string id)
		:mid(id), People(name, age, sex){}
protected:
	std::string mid;//28
};
int main()
{
	Student stu("zhangsan", 20, true, "001");
	stu.eat();   
	std::cout << sizeof(Student) << std::endl;
        std::cout << sizeof(People) << std::endl;
	std::cout<<Student::ma<<std::endl;
	stu.Show();
	Student::Elem_Type a;
	return 0;
}

我们在student中没有实现任何方法,但是我们从main函数调用发现,stu可以调用people中任意一个成员函数和成员变量,打印子类student的大小也是父类的大小加上自己的大小

 

所以派生类继承了父类中除了构造函数和析构函数意外所有的成员。

2.派生类的内存布局

基类的布局优先于派生类

3.派生类的析构方式和构造方式

又上图可以看出,父类先构造,然后子类在构造;在析构的时候正好相反,子类先析构,父类在析构

4.继承方式的权限

   1.子类无法访问父类中的private成员
   2.父类的protected成员可以被子类访问,但是不可以被外部访问
   3.private会被继承,但是无法访问
   4.class中默认的方式是private,继承默认也是private方式
   5.父类中成员通过相应的继承方式继承给子类后,这些成员对于子类来说,访问权限以继承的等级为最低级别。例如:父类中A为private权限,无论通过什么方式都不可以访问该变量

5.类和类的关系

        1.组合   a part of  has_a
        2.继承   a kind of  is_a
        3.代理

 

 

 

 

  • 2
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值