c ++虚函数问题

时间:2011-06-17 20:36:51

标签: c++ inheritance

  

可能重复:
  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();

编译器(clang 1.0)生成错误:“函数调用的参数太少,预期为1,有0”。我不明白为什么带参数的虚函数与非虚拟const函数混淆。有人可以解释一下原因吗?

4 个答案:

答案 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();

你没有指定一个期望的参数。