【问题标题】:Is there a way to call a base function outside of the class in C++?有没有办法在 C++ 中调用类之外的基函数?
【发布时间】:2012-12-26 15:37:17
【问题描述】:

这个问题类似,但是是关于从类内部调用函数:Can I call a base class's virtual function if I'm overriding it?

在这种情况下,您应该指定Base::function() 而不是function(),这将调用被覆盖的定义。

但是有没有办法在课堂之外做到这一点?我的类没有定义复制构造函数,所以我不知道如何转换为基类:

Base( derived_object ).function()

& derived_object 转换为Base* 然后调用->function() 是否合适?

感谢您的洞察力。

【问题讨论】:

  • static_cast 可能会起作用,尽管我不确定 - 虚函数的重点是它们在运行时被解析,与对象的编译时间类型无关。dynamic_cast 肯定不会起作用.
  • 您为什么要这样做?如果函数是派生类的一部分,也是基类的一部分,那么当你调用基类时你可能做错了什么。解决这个问题的更好方法是在基类中创建一个单独的函数,以便由派生类调用,并让基类自己调用该函数。
  • 请参阅下面对@Omnifarious 的评论。

标签: c++ oop


【解决方案1】:

我相信语法:

derived_ptr->Base::function();

工作得很好。虽然我真的质疑你为什么要在一个不属于你的课程的函数中这样做。特别是如果function 恰好是一个虚函数。

这是一个有问题的想法的原因是,您所做的任何使用该表示法的东西都取决于您的类的继承层次结构。此外,函数通常被重写是有原因的。你可以通过使用这种语法来解决这个问题。

【讨论】:

  • 谢谢——我有一个生成报告的 Base 对象和生成报告的 Derived 对象(在基本报告上提供额外信息)。所以我通过 Base::generate_report 创建基本报告,然后复制额外信息。这是在类外部使用访问者模式(更好地分离关注点)完成的——BaseReport 是用 Base 构造的,而 DerivedReport 是用 Derived 构造的。呸!
【解决方案2】:

试试derived_object.Base::function();

【讨论】:

  • @Oliver:是的,这是标准的。
  • @Oliver class::function() 是成员函数的“全名”。如果您没有为您调用的函数指定类,它将是“默认”(在您的情况下是派生的)。
【解决方案3】:

您可能希望使用指向类的成员函数的指针。这些使您能够根据需要将不同的基类函数映射到指针,并能够将其用作变量或函数参数。

指向成员函数的指针的语法如下所示

class Base
{
public:
    virtual bool Function();
    virtual bool OtherFunction();
};

typedef bool (Base::*)() BaseFunc;

使用这些东西的注意事项列表长达一英里——网上有很多关于如何使用它们的信息(大多数答案是“不要”)。但是,它们确实为您提供了一种明确绑定和调用基类成员函数的方法。

【讨论】:

    猜你喜欢
    • 2011-04-27
    • 2012-02-17
    • 1970-01-01
    • 2022-06-28
    • 1970-01-01
    • 2021-01-12
    • 2016-08-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多