首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >c++虚函数问题

c++虚函数问题
EN

Stack Overflow用户
提问于 2011-06-17 20:36:50
回答 4查看 659关注 0票数 3

可能重复:

Overriding a Base's Overloaded Function in C++

我有一个这样的班:

代码语言:javascript
复制
class Object {
public:
    int alignment() const;
    virtual void alignment(int i);
};

我试着像这样子类:

代码语言:javascript
复制
class Sub : public Object {
public:
    virtual void alignment(int i);
};

然后:

代码语言:javascript
复制
Sub *sub = new Sub();
sub->alignment(10);
int a = sub->alignment();

编译器(clang1.0)生成一个错误:“函数调用的参数太少,预期为1,有0。”我不明白为什么采用参数的虚拟函数会与非虚拟的const函数混淆。谁能解释一下原因吗?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-06-17 20:39:01

是。这样做会隐藏基类中的函数重载。将以下内容添加到您的Sub类中以修复此问题:

代码语言:javascript
复制
using Object::alignment;
票数 3
EN

Stack Overflow用户

发布于 2011-06-17 20:49:50

名字查找不像你想的那样起作用。

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

请注意,即使alignment中的两个Object函数都是虚拟的,也不会发生任何变化。通过重写一个方法,可以隐藏所有其他版本。

要解决这个问题,请在Sub中提供一个使用声明,以便将其他函数引入范围,这样名称查找就可以找到这两个版本。

票数 3
EN

Stack Overflow用户

发布于 2011-06-17 20:45:31

我认为,以下内容使意图更加明确:

int a = sub->Object::alignment();

此外,您也没有指定public关键字,正如Space_C0wb0y前面提到的那样

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6391533

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档