简体   繁体   中英

How do I call an overloaded function from a function in the base class?

I have a class (B) that inherits another class (A). I want to call a function from class A that has been overridden. I also want to be able to call the overridden function independent of what class inherited the base (say class C : public A , where I want to call C's version of the function.)

Here's an example

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.";
}

Edit: In my real code, I have an std::vector<A> aVector; . Then I would call aVector.push_back(B()); . If I called aVector[0].callF(); , The default a::f() would be called. As answered below, I have a problem with slicing.

Your construction:

vector_of_A.push_back( B() );

doesn't store a B in the vector. It constructs a B , then constructs an A from that, then stores that A in the vector. As a consequence, you experience slicing.

See this for more info:

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

Your code is correct.

You may be getting the behavior you observed because your were calling f() or callF() from the constructor of A. That's the only case I can think of where A::f() would get invoked instead of B::f().

Your code works for me with this little test program:

int main()
{
    // Instantiate B, and reference it via a base class pointer.
    A* b = new B;

    b->callF();
    delete b;
}

Output:

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

When calling a virtual member function within a base class member function, it's the derived member function that will be invoked.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM