【发布时间】:2014-01-28 22:57:05
【问题描述】:
我在玩 c++ 规则。我遇到了一个错误,但我无法解释。请帮助解释为什么会发生编译错误。顺便说一句,我对解决这个问题并不感兴趣。谢谢
Q1 为什么名称隐藏在这种情况下不起作用?例如,如果我们删除 lineA 的关键字 virtual。编译将起作用
Q2在case2中添加函数后,编译通过。
请帮助解释 Q1 和 Q2。
#包括
using namespace std;
class base
{
public:
virtual int func() // lineA
{
cout << "vfunc in base class\n";
return 0;
}
};
class derived: public base
{
public:
double func()
{
cout << "vfunc in derived class\n";
return 0;
}
};
int main()
{
return 0;
}
输出:
main.cpp:18:14: error: conflicting return type specified for 'virtual double derived::func()'
double func()
^
main.cpp:8:19: error: overriding 'virtual int base::func()'
virtual int func()
案例2:
#include <iostream>
using namespace std;
class base
{
public:
virtual int func()
{
cout << "vfunc in base class\n";
return 0;
}
// new added
virtual double func(int)
{
return 0.0;
}
};
class derived: public base
{
public:
double func(int)
{
cout << "vfunc in derived class\n";
return 0;
}
};
int main()
{
return 0;
} ^
【问题讨论】:
-
似乎不言自明;
double func()与int func()冲突。 -
但如果你删除 virtual ,编译工作。
-
是的。因为虚函数不同。
-
我知道它是不同的。你能解释一下导致这个错误的原因吗?
-
为什么你认为你写的应该行得通?
标签: c++ overriding overloading vtable name-hiding