本文主要是介绍【c++】11.重写、覆盖、using、typedef,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
重写、覆盖、using、typedef
注意,重写
和覆盖
并不是一个意思。
重写:
重写
是虚函数在子类中重新定义,使用override
,override
也可以不写,加上override
是规范,语义更清晰明白它是重写虚函数。
覆盖:
覆盖
是 子类定义 同名函数 覆盖
掉父类同名函数。
父类如果定义某非虚函数func1(int,int)
,子类定义了函数func1(double)
,那么子类不能再调用func1(2,3)
,因为子类只要定义了父类同名函数,不管他们参数类型和个数是否不同,都会隐藏父类的同名函数,相当于覆盖
了父类的所有同名函数。
如果子类既要定义一个同名函数,又想使用父类的这个同名函数,c++11可以通过在子类中使用using 父类名::func1
;即可。
同理,如果父类有几个复杂的构造函数,子类想继承父类所有构造函数,c++11可以在子类中使用 using 父类名::父类名
;如:
class Base{public:Base();Base(const Base &){// 很复杂的一些初始化语句};func1(int,int);
};class Child : Base{public:using Base::Base; //加上这句话,子类就继承了父类的所有构造函数using Base::func1(); // 加上这句话,就可以使用基类被覆盖(隐藏)的所有同名函数func1了。func1(); //该定义会直接覆盖掉基类所有同名函数func1. 解决办法就是使用上面的using Base::func1();
};
using 的用法:
using namespace std;
using namespaceA::namespaceB::func; // 调用命名空间B下的func()函数,该声明语句不要写成func(),不能加括号。using anotherName = int; //取别名。一般用在某类型特别长的时候,取个短点的别名。
注意区分typedef,typedef和using在取别名上作用基本一样,只是顺序不同,如:typedef int anotherName;
struct
和 class
的作用基本一样,但是常规用法是,struct
访问类型默认是public
,并且一般用在把一些变量封装成一个结构体变量。class
就是通常的用法。
这篇关于【c++】11.重写、覆盖、using、typedef的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!