虚函数,重载,继承叠加产生的问题
2011-02-17 10:52
246 查看
情况如下:
#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)是相互独立的。
#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)是相互独立的。
相关文章推荐
- 虚继承和虚函数的相关问题浅析
- 关于虚函数重载遇到的怪问题 -- 为什么经常调用了基类的函数
- python继承中重载问题:私有函数不能被子类重写
- c++菱形继承产生的问题及解决
- 标签换行产生的间距消除的三种办法及子元素继承属性问题
- 简单的java实验,涉及到 类继承以及接口问题,方法体的重写(区别于重载)
- VC++ 6.0 右键 不能重载虚函数 显示"no virtual functions available to be overridden"问题的解决
- Cpp多重继承会产生的问题
- 对象继承时重载方法的覆盖问题
- C++中继承技术引发的问题:重载(overload),覆盖(override)和隐藏(hide)的区别
- 关于继承和虚函数的问题
- 关于C++中私有继承后虚函数的访问权限与私有继承后多态的问题
- 虚继承防止多重继承产生的二义性问题
- 继承与派生、运算符的重载、虚函数的应用
- 继承产生两义性的问题
- c++ 继承 虚函数与多态性 重载 覆盖 隐藏
- 关于类的虚函数的public,private的继承问题。
- 类继承中的重载问题
- 一个C C++ 内存的问题 和 C++继承 虚函数表的点【2013.10.15小记】
- 函数重载,函数重写,虚函数,虚继承的概念以及深拷贝浅拷贝问题。