2013-12-19 3 views
-1

Когда класс наследует другой публично, то не должны ли все виртуальные функции перезаписываться? Рассмотрим код -Виртуальные функции и частные члены с открытым наследованием в C++

class A { 
private: 
    vector<int> v; 
public 
    virtual int something() { 
    cout << "A" << endl; 
    return v.size(); 
    } 
} 

class B : public A { 
private: 
    priority_queue<int> v; 
public 
    int something() { 
    cout << "B" << endl; 
    return v.size(); 
    } 
} 

Теперь, когда я вызываю функцию something() на объекте b из class B путем выполнения оператора b.something(), я получаю выход A. Почему это?

+0

Опубликовать * полный * рабочий пример, пожалуйста. То, что вы опубликовали, выглядит просто отлично - помимо проблемы, что она явно перепечатана, а не вырезана/вставлена, поскольку она не будет компилироваться ('public' sb.' Public: ') – Roddy

+0

Я адаптировал это из вашего кода и печатает «В». http://ideone.com/ADQKFc - это говорит о том, что вы делаете что-то неочевидное и не включено в ваш пример. Вы копируете B где угодно? – polkadotcadaver

+2

Держу пари, что вы [нарезка] (http://stackoverflow.com/questions/274626/what-is-the-slicing-problem-in-c) объект где-то. – jrok

ответ

0

Исправлены ошибки (см http://codepad.org/ssivYhWb)

т.е.

#include <iostream.h> 

class A { 
private: 
    vector<int> v; 
public: 
    virtual int something() { 
    cout << "A" << endl; 
    return v.size(); 
    } 
}; 

class B : public A { 
private: 
    priority_queue<int> v; 
public: 
    int something() { 
    cout << "B" << endl; 
    return v.size(); 
    } 
}; 

int main() { 
    B b; 
    b.something(); 
    return 0; 
} 

возвращает B - как и ожидалось

Смежные вопросы