Как вызвать перегруженную функцию из функции в базовом классе? - PullRequest
0 голосов
/ 10 марта 2012

У меня есть класс (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.";
}

Edit: В моем реальном коде у меня есть std::vector<A> aVector;. Тогда я бы позвонил aVector.push_back(B());. Если бы я позвонил aVector[0].callF();, было бы вызвано значение по умолчанию a::f(). Как показано ниже, у меня проблема с нарезкой.

Ответы [ 3 ]

1 голос
/ 10 марта 2012

Ваша конструкция:

vector_of_A.push_back( B() );

не хранит B в векторе. Он создает B, затем создает A из этого, затем сохраняет , который A в векторе. Как следствие, вы испытываете нарезку.

См. Это для получения дополнительной информации:

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

1 голос
/ 10 марта 2012

Ваш код правильный.

Возможно, вы наблюдаете поведение, которое вы наблюдали, потому что вы вызывали f () или callF () из конструктора A. Это единственный случай, когда я могу вспомнить, где A :: f () будет вызываться вместо B: : е ()

.
0 голосов
/ 10 марта 2012

Ваш код работает для меня с этой маленькой тестовой программой:

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.

При вызове виртуальной функции-члена в функции-члене базового класса, это производнаяфункция-член, которая будет вызвана.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...