虚函数,重载,继承叠加产生的问题
来源:互联网 发布:bigdecimal mysql 编辑:程序博客网 时间:2024/06/09 17:15
情况如下:
#include <iostream>
#include <string>
using namespace std;
class A{
public:
virtual void fun(int a){ value = a;printf("A int: %d/n",value);}
virtual void fun(char *b){ printf("A string: %s/n",b); fun(21);}
private:
int value;
};
class B : public A{
public:
virtual void fun(char *b){ printf("B string: %s/n",b); fun(22);}
private:
int vB;
};
int main()
{
B *b = new B;
b->fun("asdf");
return 0;
}
----------------------------------------------------------------------------------------
当编译时,将报错:error: invalid conversion from `int' to `char*'
说明在类B中没有 fun(int) 这个函数。在类A中的重载函数并没有传递到类B中来。
分析原因:是因为类B中的fun函数隐藏了类A中的同名函数,这是C++的特性。
解决办法:将fun(21)这一行改为 A::fun(21) 的调用方式就可以了。
由此问题得出的几个总结:
1、重载(overload)只能发生在同一名字空间内,基类和子类属于不同的名字空间。
2、基类中的虚拟函数(virtual)会被子类中同名同参数的函数覆盖(override),但在子类成员函数中可通过 Base::function() 来调用基类该函数。
3、基类中的非虚拟函数将会被子类的同名函数隐藏,即使同名函数所带参数不一样。注意是隐藏,不是覆盖。
4、基类中的虚拟函数(virtual)也将会被子类中的同名但不同参数的函数隐藏。但在子类成员函数中可通过 Base::function() 来调用基类该函数。
5、存取权限和虚拟性(virtual)是相互独立的。
- 虚函数,重载,继承叠加产生的问题
- 重载函数的继承问题
- 重载函数的继承
- 函数重载,函数重写,虚函数,虚继承的概念以及深拷贝浅拷贝问题。
- 虚继承防止多重继承产生的二义性问题
- 继承产生两义性的问题
- 子类重载父类的非虚成员函数是否对从父类中继承且使用该成员函数的方法的行为产生影响
- 子类重载父类的非虚成员函数是否对从父类中继承且使用该成员函数的方法的行为产生影响
- 函数的重载和继承
- 继承层次中的函数重载问题
- 函数重载的问题
- C++的继承、隐藏、重载和虚函数
- 【C++】内联inline、继承、重载与虚函数的解释
- 函数重载和虚函数继承
- c++的继承关系和函数重载
- 继承类的重载函数及覆盖
- JAVA - 构造函数的重载与继承
- 虚函数重载的相关问题
- Ext.复杂模板(XTemplate)
- 序列化序列化xml 实体
- 老K开通博客了
- MOSS AJAX WebParts开发环境设置
- 微软企业库5.0学习笔记(五)引用企业库程序集及企业库的依赖
- 虚函数,重载,继承叠加产生的问题
- 塞班自带浏览器下载路径问题
- 清除并防止C.JS注入MSSQL数据库
- moss实现webpart包装userControls
- Oracle触发器
- Android深入浅出之Binder机制
- 继承
- C++各大有名库的介绍
- 自写字符串转换成整型函数