Прочитал страуструпа — виртуальные функции.
У него написано что если в классе определена виртуальная функция то она будет замещаться вызовом функции производного класса где она определена.
Исходя из этого данный пример должен выводить der. Но выводится base. В чем дело?
class base
{
public:
int mm;
int kk;
base():mm(1),kk(2){};
virtual void print(){std::cout<<"base"<<std::endl;}
virtual ~base(){};
};
class der:public base
{
public:
int pp;
der():base(),pp(1){};
void print(){std::cout<<"der"<<std::endl;}
};
void f(base b)
{
b.print();
}
int main()
{
der *d = new der();
f(*d);
}
При передаче обьекта по указателю все работает правильно. Таки почему?
#include <iostream>
class base
{
public:
int mm;
int kk;
base():mm(1),kk(2){};
virtual void print(){std::cout<<"base"<<std::endl;}
virtual ~base(){};
};
class der:public base
{
public:
int pp;
der():base(),pp(1){};
void print(){std::cout<<"der"<<std::endl;}
};
void f(base *b)
{
b->print();
}
int main()
{
der *d = new der();
f(d);
int a;
std::cin>>a;
}
N>Исходя из этого данный пример должен выводить der. Но выводится base. В чем дело?
Дело в так называемой "срезке".
N>void f(base b)
N>{
N> b.print();
N>}
Вот здесь объект типа der урезается до base. Чтобы этого не происходило, передавай объект либо по ссылке, либо по указателю, например, так:
void f(base& b)
{
b.print();
}
Спасибо господа! Разобрался.
В данном случае непонимание имело место, потому что проводил аналогии с явой, где все передается по ссылке и все нормально)