您的位置:首页 > 其它

虚函数,重载,继承叠加产生的问题

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)是相互独立的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: