我有一个类似这样的课程:
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();
编译器(clang 1.0)生成错误:“函数调用的参数太少,预期为1,有0”。我不明白为什么带参数的虚函数与非虚拟const函数混淆。有人可以解释一下原因吗?
答案 0 :(得分:3)
是。像这样执行隐藏基类中的函数重载。将以下内容添加到Sub
课程中以解决此问题:
using Object::alignment;
答案 1 :(得分:3)
名称查找不会像您认为的那样发挥作用。
编译器从Sub
开始,查看它是否有一个名为alignment
的函数。它确实...所以它停止寻找。它甚至从来都没有看过父类,因为它已经找到了匹配。因此Sub
中的虚拟覆盖隐藏了Object
中的非虚函数。不幸的是,这种匹配需要一个整数参数,而你没有提供一个参数。
请注意,即使alignment
中的Object
个函数都是虚拟的,也不会发生任何变化。通过覆盖一个方法,您可以隐藏所有其他版本。
要修复它,请在Sub
中提供一个using声明,以将其他函数放入范围,这样名称查找就可以找到这两个版本。
答案 2 :(得分:1)
在我看来,以下内容使意图更清晰:
int a = sub->Object::alignment();
此外,您没有指定public关键字,如Space_C0wb0y
之前所述答案 3 :(得分:-2)
int a = sub-> alignment();
你没有指定一个期望的参数。