【问题标题】:C++: How to call a parent class function from outsideC++:如何从外部调用父类函数
【发布时间】:2012-08-24 08:03:12
【问题描述】:

我有:

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 的版本?

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

【问题讨论】:

  • 你能澄清一下你所说的“没用”吗?当您尝试上述代码时,究竟会发生什么?
  • 这样做完全违背了使函数虚拟化的目的,因此这意味着A 类的用户正在逃避类设计者的意图。这可能意味着某处存在设计错误:A 没有提供所需的所有功能,或者A 的用户不明白A 应该做什么。
  • @Code-Guru:因为成员函数是虚拟的,所以无论指针的静态类型如何(即强制转换是无用的),它都会被分派给最终的覆盖器,除非您禁用动态分派打电话...
  • @DavidRodríguez-dribeas 在 OP 中,该函数甚至不是公共的,因此代码甚至不应该编译,调度也不会成为问题。因此,为什么我问在这种情况下“不起作用”是什么意思。我有点不安,我花时间回答错误的问题,因为 OP 不完整......

标签: c++ inheritance pointers virtual


【解决方案1】:

您需要公开您的功能。您只需进行以下更改即可:

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

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

如果您不这样做,这些功能会自动成为私有的,并且无法从“外部”访问。

【讨论】:

  • 它们是公开的,我只是没有在示例中指定。
  • @nahpr 为了将来参考,我建议您认真努力,不要在此处发布的代码中引入其他错误。这将有助于避免浪费时间整理无用的答案。
【解决方案2】:

当您使用 :: 范围解析形式命名函数时,您调用了命名函数,就好像它不是虚拟的一样。

ptr->A::foo();

【讨论】:

  • +1。这是正确的,但如果您还讨论 OP 代码中的可访问性问题会更好。
  • @Nawaz:如果还提到了这违反了所有 OO 原则的事实,那就更好了 :) B 的用户不应该关心调用了哪个版本的 foo,这是主要的多态点。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-01-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-11
相关资源
最近更新 更多