可能重复:
Overriding a Base's Overloaded Function in C++
我有一个这样的班:
class Object {
public:
int alignment() const;
virtual void alignment(int i);
};我试着像这样子类:
class Sub : public Object {
public:
virtual void alignment(int i);
};然后:
Sub *sub = new Sub();
sub->alignment(10);
int a = sub->alignment();编译器(clang1.0)生成一个错误:“函数调用的参数太少,预期为1,有0。”我不明白为什么采用参数的虚拟函数会与非虚拟的const函数混淆。谁能解释一下原因吗?
发布于 2011-06-17 20:39:01
是。这样做会隐藏基类中的函数重载。将以下内容添加到您的Sub类中以修复此问题:
using Object::alignment;发布于 2011-06-17 20:49:50
名字查找不像你想的那样起作用。
编译器从Sub开始,并查看它是否有一个名为alignment的函数。它确实..。所以它就不再看了。它甚至从不打扰查看父类,因为它已经找到了匹配项。因此,Sub中的虚拟覆盖隐藏了Object中的非虚拟函数。不幸的是,该匹配需要一个完整的参数,而您没有提供一个参数。
请注意,即使alignment中的两个Object函数都是虚拟的,也不会发生任何变化。通过重写一个方法,可以隐藏所有其他版本。
要解决这个问题,请在Sub中提供一个使用声明,以便将其他函数引入范围,这样名称查找就可以找到这两个版本。
发布于 2011-06-17 20:45:31
我认为,以下内容使意图更加明确:
int a = sub->Object::alignment();
此外,您也没有指定public关键字,正如Space_C0wb0y前面提到的那样
https://stackoverflow.com/questions/6391533
复制相似问题