2024年最新【C++难点收录】“C

{
public:
void func(int val=0){ std::cout<<“B->”<< val <<std::endl; }
};
int main(int argc ,char* argv[])
{
B*p = new B;
p->test();//p->test§
return 0;
}



> 
> 输出:B->1;重写,只会重写函数的实现,不对(int val=0)中的val=0干扰,可以是`void func(int a)`或`void fun(int)`都会构成重写,所以val的值还是对象A的val
> 
> 
> 


总结:子类的缺省参数不起作用,重写虚函数是一种接口继承,也就可以理解成函数、返回值、参数(包括缺省参数)都是父类继承下来,所以这里用的 父类的缺省参数


#### 隐藏


( 1)如果派生类的函数与基类的函数同名,但是参数不同。此时,不论有无 virtual  
 关键字,基类的函数将被隐藏(注意别与重载混淆)。  
 ( 2)如果派生类的函数与基类的函数同名, 并且参数也相同, 但是基类函数没有 virtual  
 关键字。此时,基类的函数被隐藏(注意别与覆盖混淆)。  
 示例程序中:



#include <iostream.h>
class Base
{
public:
virtual void f(float x){ cout << "Base::f(float) " << x << endl; }
void g(float x){ cout << "Base::g(float) " << x << endl; }
void h(float x){ cout << "Base::h(float) " << x << endl; }
};
class Derived : public Base
{
public:
virtual void f(float x){ cout << "Derived::f(float) " << x << endl; }
void g(int x){ cout << "Derived::g(int) " << x << endl; }
void h(float x){ cout << "Derived::h(float) " << x << endl; }
};


( 1)函数 Derived::f(float)覆盖了 Base::f(float)。  
 ( 2)函数 Derived::g(int)隐藏了 Base::g(float),而不是重载。  
 ( 3)函数 Derived::h(float)隐藏了 Base::h(float),而不是覆盖。


## 多态


1、虚函数的重写 2、父类的指针或引用调用才符合多态条件


多态是在**运行时**到指向对象的虚表中查找要调用的虚函数的地址来进行调用,如果没加\*或&,就会在编译时直接确认类型调用函数的地址


### 纯虚函数



//virtual void fun(){}//虚函数
virtual void fun() = 0;//纯虚函数


包含纯虚函数的类叫抽象类,抽象类不能实例化出对象


![image-20220829200400785](https://img-blog.csdnimg.cn/img_convert/95ca00307475ca5ff808e378438ec4d8.png)


纯虚函数的作用:


1、强制子类去完成重写:父类的纯虚函数`virtual void fun() = 0;`子类重写:`virtual void func(){}`


2、表示抽象的类型,抽象就是在现实中没有对应的实体的。


### 虚函数表


![image-20220829173844321](https://img-blog.csdnimg.cn/img_convert/7d89729a3219127204e3f34effbfa376.png)


在32位平台下,没有加virtual大小为1,加了之后就会变4,这是因为加了虚函数关键字,底层会有个vftptr(vitual function table pointer)**虚函数表指针**;


**1、虚函数存在哪?**



> 
> 答:代码段
> 
> 
> 


**2、虚函数表(虚表)存在哪?**



> 
> 代码段(常量区)
> 
> 
> 


![image-20220829203205038](https://img-blog.csdnimg.cn/img_convert/f0484697309a9d2381054aff2d23a699.png)


## set


## map


下面两种方式等同



//mp.insert(pair<int, int>(6, 6));
mp.insert(make_pair(5, 5));


日常大家喜欢用make\_pair因为它不用声明模板参数,自动推


![image-20220831193822769](https://img-blog.csdnimg.cn/img_convert/90391c3d5091a60c24b6fcd9dec4c182.png)



#include
using namespace std;
#include
#include

int main()
{
map<int, int>mp;
mp.insert(pair<int,int>(1, 1));
mp.insert(pair<int, int>(3, 3));
mp.insert(pair<int, int>(6, 6));
mp.insert(make_pair(5, 5));
auto lt = mp.begin();
while (lt != mp.end())
{
cout << lt->first << “:” << lt->second << endl;
//cout << (*lt).first << “:” << (*lt).second << endl;
lt++;
}
cout << endl;

return 0;

}


![image-20220831194236883](https://img-blog.csdnimg.cn/img_convert/31ee4df479095ea3dfb3e48fff5b85ef.png)


总结:



> 
> map
> 
> 
> 1、增 insert+operator[]
> 
> 
> 2、删 erase
> 
> 
> 3、查 find+(不建议operator[])
> 
> 


![img](https://img-blog.csdnimg.cn/img_convert/87a920ee1a434df99dec0b436f4a3236.png)
![img](https://img-blog.csdnimg.cn/img_convert/96b33740d7a39a57b09868429a878ab6.png)

**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**

**[需要这份系统化资料的朋友,可以戳这里获取](https://bbs.csdn.net/topics/618545628)**


**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**

只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**

**[需要这份系统化资料的朋友,可以戳这里获取](https://bbs.csdn.net/topics/618545628)**


**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值