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

时间:2012-03-10 02:25:00

标签: c++ class inheritance vector

我有一个继承另一个类(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<A> aVector;。然后我会打电话给aVector.push_back(B());。如果我拨打aVector[0].callF();,则会调用默认的a::f()。 如下所述,我有切片问题。

3 个答案:

答案 0 :(得分:1)

你的建设:

vector_of_A.push_back( B() );

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

有关详细信息,请参阅此处:

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

答案 1 :(得分:1)

您的代码是正确的。

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

答案 2 :(得分:0)

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

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.

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