C++:如何从外部调用父类函数

9

我有:

class A{
    public:
        virtual void foo();
};

class B : public A{
    public:
        void foo();
};

B *ptr = new B();

我想使用“ptr”指针直接调用A的foo()方法。

当我尝试这样做时:

(A*)ptr->foo();

它仍然调用B版本的foo()函数。我如何调用A版本呢?

这个有可能吗?还有其他可选方案吗?谢谢。


请查看 http://en.wikipedia.org/wiki/Scope_resolution_operator - Pramod
你能澄清一下你所说的“没有工作”是什么意思吗?当你尝试上面的代码时,具体会发生什么? - Code-Apprentice
3
完全这样做违背了将函数设置为虚函数的目的,因此意味着类A的用户逃避了类设计者的意图。这可能意味着某处存在设计错误:要么A没有提供所需的所有功能,要么A的用户不理解A应该执行的任务。 - Pete Becker
1
@DavidRodríguez-dribeas 在原帖中,该函数甚至不是公共的,因此代码甚至不应该编译,调度也不应该成为问题。这就是为什么我问在这种情况下“不起作用”意味着什么。我有点烦恼,因为我浪费了时间回答错误的问题,因为原帖是不完整的... - Code-Apprentice
@Code-Guru- 它调用了B的foo()函数。 - nahpr
显示剩余4条评论
2个回答

19

使用 :: 作用域分辨符给函数命名时,会像非虚函数一样调用所命名的函数。

ptr->A::foo();

3
没问题,虽然您在 OP 的代码中提及可访问性问题会更好。 - Nawaz
4
@Nawaz: 如果能提到这违反了所有面向对象原则,那就更好了 :) 使用B的用户不应该关心调用哪个版本的foo,这是多态的主要思想。 - David Rodríguez - dribeas

2
您需要将您的函数公开。只需进行以下更改即可实现:
您需要将函数声明为public。
class A{
    public:
        virtual void foo();
};

class B : public A{
    public:
        void foo();
};

今日免费次数已满, 请开通会员/明日再来

它们是公共的,我只是在示例中没有指定。 - nahpr
4
为了以后参考,我建议您认真努力地避免在此发布的代码中引入额外的错误。这将有助于避免浪费时间来筛选无用的答案。 - Code-Apprentice

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