虚函数覆盖
来源:互联网 发布:联合国合法席位知乎 编辑:程序博客网 时间:2024/05/01 07:56
1。覆盖函数,即在子类中用相同的函数名和签名重写父类的方法,虚函数,在子类中用相同的函数名和签名重写父类的方法(前面有virtual关键字)。如下
class Father
{
public:
void FunctionA() const
{
cout << "This is FunctionA of class Father." << endl;
}
virtual void FunctionB() const
{
cout << "This is FunctionB of class Father." << endl;
}
};
class Child : public Father
{
public:
void FunctionA() const
{
cout << "This is FunctionA of class Child." << endl;
}
virtual void FunctionB() const
{
cout << "This is FunctionB of class Child." << endl;
}
};
2。在将父类对象的指针指向子类对象的时候 Father* father = new Child;
如father->FunctionA(),则执行的是Father中的实现;father->FunctionB(),
则执行的是Child中的实现。
3。如果直接声明子类对象,Child child;则无论child.FunctionA()还是 child.FunctionB(),执行的都是Child中的实现。
总结:调用函数的时候,关键看对象的类型 。
记住是对象的类型,不管是指针还是引用(同样是对象的类型)。
好了有了对象的类型就好办了。当你用这个对象(或者是指针、引用)去调用函数时,
1:该对象(实体)即不是指针或引用的形式,可以轻松的调用函数。
2:但是当我们用引用或指针形式时,有个问题是区别指针(引用)的类型和指针(引用)所指实体对象的类型。
A:你用指针来调用某函数,若函数是非虚函数,非虚函数是静态编译的(即编译时刻确定的)。也就是说他不会去虚函数表找这个函数(因为不是虚函数),因 此调用的是指针类型的那个类的相关函数。即使派生类有这个函数(这是实际编程时的大忌!!!)。这就是 你的void FunctionA() const ;
B: 当你用这个指针去调用一个虚函数时,他就到虚函数表中,找这个名字的函数,从指针所指对象的类型(即派生类)依次向父类走,直到遇到第一个与次匹配的函数名。
还有一篇虚函数表讲解的文章,见http://blog.csdn.net/hairetz/archive/2009/04/29/4137000.aspx
- 虚函数覆盖
- 虚函数 以及覆盖
- 虚函数覆盖
- 覆盖于虚函数
- 虚函数覆盖虚函数
- 函数覆盖
- C++继承:同名隐藏、覆盖,虚函数
- C++继承:同名隐藏、覆盖,虚函数
- C++继承:同名隐藏、覆盖,虚函数
- C++继承:同名隐藏、覆盖,虚函数
- C++基础 虚函数、重载、覆盖、隐藏
- 虚函数,覆盖和多态
- 牛客 题库 virtual虚函数的覆盖
- C++多态 & 虚函数 & 虚析构 & 覆盖 & 虚表
- 【2015.2.9】重载、覆盖、隐藏、虚函数、纯虚函数
- 成员函数的重载、覆盖、隐藏 和 虚函数
- 构造函数,析构函数,虚函数,内联函数,静态成员函数,重载,覆盖,隐藏
- 覆盖构造函数
- Qt学习之路(26): 反走样
- Linux2.4内核和2.6内核对Initrd处理流程
- Qt学习之路(27): 渐变填充
- 再谈iframe自适应高度 By 大米
- Qt学习之路(28): 坐标变换
- 虚函数覆盖
- MMS
- A级职员打算离开公司的真正理由
- Qt学习之路(29): 绘图设备
- MMS2
- 百万数据查询优化技巧三十则
- Qt学习之路(30): Graphics View Framework
- APN
- 解决无法设置单元格最低高度的问题