[C++] STL непонятки с наследованием

Maurog

Имеем код:

class A {
public:
virtual int f = 0;
};

class B : public A {
public:
virtual int f {
std::cout << "Im B!" << std::endl;
return 0;
}
};
class C : public B {
public:
virtual int f {
std::cout << "Im C!" << std::endl;
return 0;
}
};
int main
{
std::vector<B> v;
v.push_back(B;
v.push_back(C;
v.push_back(B;
std::for_each(v.begin v.end std::mem_fun_ref(&A::f;
std::cin.get;
return 0;
}

На выходе:
  
Im B!
Im B!
Im B!

Если же такой код:

int main
{
std::vector<B*> v;
v.push_back(new B);//dont care about mem leaks due to exeption thrown by push_back;
v.push_back(new C);
v.push_back(new B);
std::for_each(v.begin v.end std::mem_fun(&A::f;
std::cin.get;
return 0;
}

то выход такой:

Im B!
Im C!
Im B!

Почему выходы разные?
Как сделать, чтобы первый main выдавал такой же вывод?

okunek

Ну дык ф первом примере у тебя все объекты C слайсятся до B.
Ты их по значению передаешь в вектор.

Dasar

вот этот код
v.push_back(C;
делает то же самое, что и
v.push_back(B(C;
т.к. вставка происходит по значению, то при вставке - вызывается конструктор копирования B.
ps
"наивная" проверка на то, что все правильно:
если бы в коллекцию на самом деле вставлялся бы элемент C, то где бы хранился хвост C, если размер C больше, чем размер B?

Maurog

догнал
спасибо;)
Оставить комментарий
Имя или ник:
Комментарий: