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

C++ C++;:如何从外部调用父类函数,c++,inheritance,pointers,virtual,C++,Inheritance,Pointers,Virtual,我有: 我想直接使用“ptr”指针调用A的foo() 当我尝试 class A{ public: virtual void foo(); }; class B : public A{ public: void foo(); }; B *ptr = new B(); 它仍然调用B版本的foo()。我怎么称呼A的版本呢 这可能吗?有哪些替代方案?谢谢。使用:范围解析表单命名函数时,调用命名函数,就好像它不是虚拟函数一样 (A*)ptr->f

我有:

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

当我尝试

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

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

B *ptr = new B();
它仍然调用B版本的
foo()
。我怎么称呼A的版本呢


这可能吗?有哪些替代方案?谢谢。

使用
范围解析表单命名函数时,调用命名函数,就好像它不是虚拟函数一样

(A*)ptr->foo();

你需要公开你的职能。您只需进行以下更改即可完成此操作:

ptr->A::foo();

如果您不这样做,这些函数将自动成为私有函数,并且从“外部”无法访问。

请看一看,您能否澄清“不工作”是什么意思?当您尝试上述代码时,会发生什么情况?这样做完全违背了使函数虚拟的目的,因此这意味着类
a
的用户正在逃避类设计者的意图。这可能意味着某个地方存在设计错误:
a
不能提供所需的所有功能,或者
A
的用户不明白
A
应该做什么。@代码大师:因为成员函数是虚拟的,它将被分派到最终重写器,而不管指针的静态类型如何(即强制转换是无用的),除非您在操作中禁用调用的动态分派…@DavidRodríguez dribeas,该函数甚至不是公共的,因此代码甚至不应该编译,分派也不会成为问题。因此,为什么我问在这种情况下“不起作用”是什么意思。我有点不安,我花时间回答了错误的问题,因为OP不完整…+1。这是正确的,不过如果你也在OP的代码中讨论可访问性问题会更好。@Nawaz:如果还提到这违反了所有OO原则,那就更好了:)
B
的用户不应该关心
foo
的哪个版本,这是多态性的主要点。它们是公开的,我只是没有在示例中指定它。@nahpr为了将来的参考,我建议您尽量避免在这里发布的代码中引入额外的错误。这将有助于避免浪费你的时间来整理无用的答案。
class A{
    public:
        virtual void foo();
};

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