C++的隐藏、重写、重载和信息隐藏

贤哲所追求的不是享乐,而是源于痛苦的自由。

面试过程中有被问到隐藏的概念。把隐藏答成类的信息隐藏了,今天被一个好心的面试官指出来,这里重新学习一下。

#include <iostream>
#include <vector>
#include <string>

using namespace std;

/*
重载:
1. 函数的可见范围相同。不同cpp文件的同名函数不构成重载。
2. 函数的返回值不同不是重载的判断条件。
3. const的函数可以和非const函数构成重载。
4. virtual关键字限定函数可以和无virtual关键字限定的函数构成重载。
5. 在类中,成员函数的信息隐藏类型是public、private、与protected对函数是否是重载没有任何影响
6. 函数重载是函数名相同,形参列表不同(形参的个数不同,形参的类型不同,形参的个数相同但是相同位置的形参的类型不同)
7. C++根据重载的函数参数会生成不同的标识符用于区别不同的函数,这样才能根据形参进行准确的函数调用。
*/

void fun() {
	cout << "这里的fun函数是全局函数的可见范围是整个cpp文件,与类A中的fun函数不构成重载。" << endl;
}

class A {
public:
	A()=default;

	virtual void fun(double d=0.0) { cout << "加virtual的函数重载" << endl; }
private:
	void fun() { cout << "不加virtual的函数重载" << endl; }
public:
	const bool fun2() {
		cout << "这是返回值为const bool的函数,这里cosnt限定了true=fun2()是错误的写法" << endl;
	}

	bool fun2(const string& str=string("刘强")) {
		cout << "这是非const限定的函数重载" << endl;
	}


private:
	int a;
};

/*
覆盖:
覆盖只发生在父类和子类之间。要求必须同时满足:
1. 父类的成员函数声明为虚函数。
2. 子类对父类虚函数的重写必须满足同名同参,但是可以改变重写函数的信息隐藏类型。
3. 覆盖是子类重写的函数地址覆盖了父类虚函数表中的函数地址。覆盖是实现多态的基础。
*/

class Father {
private:
public:
	Father() = default;
protected:
	virtual void fun(double d,char[]) {
		cout << "这是父类的虚函数调用" << endl;
	}
protected:
};

class Son : public Father{
private:
public:
	Son() = default;
//private:
//	void fun(double d, char[])override {
//		cout << "这是子类的虚函数调用" << endl;
//	}
public:
	void fun(double d, char[])override {
		cout << "这是子类的虚函数调用" << endl;
	}
protected:
};

/*
隐藏:
1. 隐藏发生在父类与子类之间。
2. 要求子类的函数名与父类的函数名相同,但是形参可以不同。
3. 如果父类加了virtual限定,则注意运行时静态多态和动态多态是由区别的
*/

class C {
public:
	C() = default;
public://这里也可以写成protected
	void fun() {
		cout << "这是父类C的fun函数调用" << endl;
	}
	virtual void fun2() {
		cout << "这是父类的virtual fun2函数的调用" << endl;
	}
private:

protected:

};

class Cson:public C {
public:
	Cson() = default;
public:
	void fun() {
		cout << "这是子类Cson的fun函数调用" << endl;
	}
	void fun2(int a,int b)/*override */{//这里加override报错了
		cout << "这是子类的fun2函数的调用" << endl;
	}
private:

protected:

};

/*
信息隐藏:
信息隐藏是依据关键字public、private和protected实现的。
当父类不希望成员函数和成员变量在类外不可见,又希望子类能够使用父类的成员函数和成员变量,那么就将变量声明为protected,protected是为了继承机制才出现的。
*/

int main() {
	/*
	Son s;
	char ch[] = "hello";
	s.fun(0.0,ch);
	*/

	Cson cs;
	cs.fun();
	cs.C::fun();//通过域限定符限定访问的是C类的fun函数
	cs.fun2(1,1);//这里是构成了重写了的,但是没有构成覆盖。
	C* cs2 = new Cson();
	//cs2->fun2(1,1,);//这样会报错。因为cs2指向的是父类的虚函数表,但是子类没有对虚函数表的函数地址进行覆盖,因为只是函数名相同,单数形参不同,没有形成覆盖。在使用多台时就会出错。
	return 0;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值