如何从基类中的函数调用重载函数?

Posted

技术标签:

【中文标题】如何从基类中的函数调用重载函数?【英文标题】:How do I call an overloaded function from a function in the base class? 【发布时间】:2012-03-10 02:24:59 【问题描述】:

我有一个继承另一个类 (A) 的类 (B)。我想从已被覆盖的 A 类中调用一个函数。我还希望能够独立于继承基的类调用被覆盖的函数(比如 class C : public A ,我想在其中调用 C 的函数版本。)

这是一个例子

class A 

public:
    void callF();
    virtual void f() ;
;

class B : public A 

public:
    void f();
;

void A::callF()

    //FYI, I want to be able to call this without knowing what the super class is.
    f();


void B::f()

    std::cout << "I want this function to be called, but instead the default f() is called.";

编辑: 在我的真实代码中,我有一个std::vector&lt;A&gt; aVector;。然后我会打电话给aVector.push_back(B());。如果我调用aVector[0].callF();,默认的a::f() 将被调用。 如下所述,我在切片时遇到问题。

【问题讨论】:

请稍微澄清一下您的问题。当从基类调用被覆盖的函数 f() 时,您希望能够调用它。在上面的示例中,当您在类 A 中调用 f() 时,您希望调用 B 中的覆盖函数。是这样吗? 没错。另外,假设我实现了继承 A 的 class C。当我调用 C c; c.callF() 时,我希望它调用 C 的 f() 版本。 您提供给我们的代码完全符合您的要求。如果您的程序表现不同,则问题可能在于您没有向我们展示的内容。请创建一个小型的完整程序来演示问题并将该程序粘贴到您的问题中。 sscce.org 你的虚拟继承在哪里? 【参考方案1】:

你的建筑:

vector_of_A.push_back( B() );

不在向量中存储B。它构造一个B,然后从中构造一个A,然后将那个 A 存储在向量中。因此,您会遇到切片。

查看更多信息:

https://***.com/a/4403759/8747

【讨论】:

【参考方案2】:

你的代码是正确的。

您可能会得到您观察到的行为,因为您从 A 的构造函数调用 f() 或 callF()。这是我能想到的唯一情况是 A::f() 将被调用而不是 B: :f().

【讨论】:

这是一个很好的观点。我可能一直在从构造函数调用它,或者我可能在从 std::vector 调用它时遇到问题。我在构造函数之外调用它,但它仍然调用 A::f()。【参考方案3】:

您的代码适用于我的这个小测试程序:

int main()

    // Instantiate B, and reference it via a base class pointer.
    A* b = new B;

    b->callF();
    delete b;

输出:

I want this function to be called, but instead the default f() is called.

在基类成员函数中调用虚成员函数时,将调用派生成员函数。

【讨论】:

好的。我可能遇到了其他问题。在我的真实代码中,我有一个std::vector&lt;A&gt; aVector;。然后我会打电话给aVector.push_back(B());。如果我调用aVector[0].callF();,默认的a::f() 将被调用。我现在可能应该问另一个问题.. 感谢您的回答! @sFuller 请阅读sscce.org,尤其是“确保您发布的代码显示问题!”的部分。 啊,你的问题很常见,叫做切片。我相信其他回答者会比我更快地解释你的问题,因为我没有他们快速的忍者技能。请编辑您的问题并将您刚刚在此处发布的评论粘贴到我的回答中。

以上是关于如何从基类中的函数调用重载函数?的主要内容,如果未能解决你的问题,请参考以下文章

从基类调用派生类中的函数

类中的同名函数关系,重载,覆盖/重写,隐藏

为啥派生类中的重写函数会隐藏基类的其他重载?

为啥派生类中的重写函数会隐藏基类的其他重载?

为啥派生类中的重写函数会隐藏基类的其他重载?

从派生类调用重载函数