Опять противоречия.
От: Nortsx  
Дата: 28.07.11 12:03
Оценка: :))) :)
Прочитал страуструпа — виртуальные функции.
У него написано что если в классе определена виртуальная функция то она будет замещаться вызовом функции производного класса где она определена.
Исходя из этого данный пример должен выводить 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);
}
Re: Замечено
От: Nortsx  
Дата: 28.07.11 12:05
Оценка: :)
При передаче обьекта по указателю все работает правильно. Таки почему?
#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;
}
Re: Опять противоречия.
От: Vamp Россия  
Дата: 28.07.11 12:06
Оценка:
N>Исходя из этого данный пример должен выводить der. Но выводится base. В чем дело?
Дело в так называемой "срезке".

N>void f(base b)

N>{
N> b.print();
N>}
Вот здесь объект типа der урезается до base. Чтобы этого не происходило, передавай объект либо по ссылке, либо по указателю, например, так:


void f(base& b)
{
    b.print();
}
Да здравствует мыло душистое и веревка пушистая.
Re: Опять противоречия.
От: Anpek  
Дата: 28.07.11 12:06
Оценка:
Здравствуйте, Nortsx, Вы писали:

Так ты ж base передал
Передай по указателю, будет der
Re[2]: Опять противоречия.
От: Nortsx  
Дата: 28.07.11 12:07
Оценка:
Спасибо господа! Разобрался.
В данном случае непонимание имело место, потому что проводил аналогии с явой, где все передается по ссылке и все нормально)
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.