虚函数(虚析构函数)与作用域

版权声明:如需转载请博客下面留言,并在转载时请标明出处,并附带链接! https://blog.csdn.net/patrick_star_cowboy/article/details/79969907
一丶虚函数与作用域
名字查找优先于类型查找
声明在内层作用域的函数并不会重载声明在外层作用域的函数
如果派生类成员和基类成员的形参列表不一致,基类成员也仍然会被屏蔽掉!!!

知识点1 :当类之间存在继承关系时,派生类的作用域嵌套在其基类的作用域之内,如果一个名字在派生类作用域中找不到定义,则编译器会继续在外层基类中寻找
知识点2 :派生类可以重用定义在其直接基类或者间接基类中的名字,此时定义在内层作用域的名字将隐藏外层作用于中的名字,但是我们可以使用作用域运算符来访问使用隐藏的基类成员
知识点3 :除了覆盖虚函数,派生类最好不要重用其他基类中的名字
知识点4 :函数的调用及解析过程:
1:确定其静态类型,必然是一个类类型
2:在其静态类型的类中查找该成员,找不到,则向外层的基类移动,再没有,编译器报错
3:找到了该成员,进行常规的类型检查,编译器再根据其是否是虚函数产生不同的代码
若是虚函数且为引用或者指针类型的调用,则需要进行动态绑定,编译器产生的运行代码在运行时将决定到底运行该虚函数的哪个版本,依据其动态类型
若不是虚函数或是没有指针引用调用,则产生常规调用
知识点5 :内层作用域中的函数不会重载外层作用域中的函数,所以派生类成员若有名字相同,即使其形参列表不一致,基类成员也会被隐藏掉—名字查找优先于类型检查
知识点6 :由知识点5,基类和派生类的虚函数参数列表必须相同,并且可以通过基类的作用域运算符调用基类的虚函数,若派生类的与基类虚函同名的成员参数列表与虚函数不同,那么派生类中的成员并没有覆盖基类的相应虚函数,因为形参列表不一致,派生类将拥有两个同名成员。
由知识点6:若要覆盖,则需要形参列表一致

二丶1.虚析构函数
知识点1 :虚析构函数:可以动态分配继承体系中的对象,如果我们需要删除一个指向派生类对象的基类指针,就需要虚析构函数,这样可以确保delete基类指针时将运行正确的虚构函数版本(动态绑定虚析构函数)
知识点2 :基类需要一个虚析构函数产生的影响:一个类定义了析构函数,即使它通过=default的形式生成合成的版本,编译器也不会为这个类合成移动操作,基类没有移动操作,意味着派生类也没有移动操作
2.默认构造函数
知识点1 :如果基类中的默认构造函数、拷贝构造函数或是析构函数被删除或是不可访问,则其派生类中的相应成员是被删除的
知识点2 :大多数基类都会有一个虚析构函数,因此基类通常不会含有合成的移动操作,派生类中也如此,如果我们确实需要移动的操作,我们需要自行首先在基类中进行定义
如果删除了Quote基类的默认构造函数,那么它所有派生类中都不能使用默认构造函数进行初始化对象,如果需要默认初始化,则会报错

猜你喜欢

转载自blog.csdn.net/patrick_star_cowboy/article/details/79969907
今日推荐