C++虚函数问题

3
可能重复:
在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函数混淆。能否有人解释一下原因?

请查看此链接:https://dev59.com/UXNA5IYBdhLWcg3wn_bD#888313 - Fred Larson
@Fred Larson,这正是我正在寻找的解释,谢谢! - joshfisher
4个回答

3

是的。这样做会在基类中隐藏函数重载。在您的Sub类中添加以下内容即可解决此问题:

using Object::alignment;

在进行这个操作时,我会收到一个有关于vtable未定义引用的错误。请参见此处 - Björn Pollex
一个重载的成员函数可以是虚函数吗? - Mahesh
1
@Space:你需要定义这些函数。 - BlueRaja - Danny Pflughoeft

3

名称查找并不像你想的那样工作。

编译器从Sub开始,查看是否有名为alignment的函数。它确实有...所以它停止查找。它甚至不会去查看父类,因为它已经找到了一个匹配项。因此,在Sub中的虚拟覆盖隐藏了Object中的非虚拟函数。不幸的是,这个匹配需要一个整数参数,而你没有提供。

请注意,即使Object中的两个alignment函数都是虚拟的,也不会改变任何东西。通过覆盖一个方法,你隐藏了所有其他版本。

要修复它,请在Sub中提供一个使用声明,将另一个函数引入作用域,这样名称查找就可以找到两个版本。


1
在我看来,以下代码可以更清晰地表达意图:
int a = sub->Object::alignment(); 此外,正如Space_C0wb0y之前所提到的,您没有指定public关键字。

1
这确实是另一种解决方案。但我不能同意这更清晰! - Oliver Charlesworth

-2

int a = sub->alignment();

你没有在期望参数的位置指定参数。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接