c++中的重载,重写,重定义
程序员文章站
2022-05-28 20:01:40
c++中的几个容易混淆的概念:
(1)重载:在同一作用域中,函数名相同,参数列表不同,返回值可同可不同的函数。关于函数重载的知识在《函数重载》这篇博客中有详细介绍。
(2)重写:又叫覆盖,是指不在同...
c++中的几个容易混淆的概念:
(1)重载:在同一作用域中,函数名相同,参数列表不同,返回值可同可不同的函数。关于函数重载的知识在《函数重载》这篇博客中有详细介绍。
(2)重写:又叫覆盖,是指不在同一个作用域中(分别在父类和子类中),函数名,参数个数,参数类型,返回值类型都相同,并且父类函数必须有virtual关键字的函数,就构成了重写(协变除外)。协变:协变也是一种重写,只是父类和子类中的函数的返回值不同,父类的函数返回父类的指针或者引用,子类函数返回子类的指针或者引用。
下边看个例子:
class b { public: b() :_num(1) {} virtual void show() { cout << _num << endl; } protected: int _num; }; class d :public b { public: d() :_num(2) {} virtual void show() { cout << _num << endl; } protected: int _num; }; int main() { d d; d.show(); cout << sizeof(d) << endl; system("pause"); return 0; }
这段程序中,show函数和_num成员都被重写了,调用d的show函数打印2.sizeof(d)的结果是12.没错,就是12.父类的show函数被子类的show函数覆盖,_num只是被隐藏了(下边介绍),但是仍然存在,另外内存中还会存在一个虚函数表的指针,存放虚函数的地址,通过查看虚函数表可以发现,表中只会存放子类show函数的地址,说明父类
的show函数被覆盖。如下图:
(3)重定义:又叫隐藏,是指在不同的作用域中(分别在父类和子类中),函数名相同,不能构成重写的都是重定义(重定义的不光是函数,还可以是成员变量)。上例中的_num成员就构成了重定义(子类中仍然存在),这里就不再给出实例。