Может ли объект производного класса рассматриваться так, как если бы это был тот же тип базового класса? <NoobieQ /> - PullRequest
0 голосов
/ 22 мая 2010

Скажи, что я получил:

class X_
{
public:
    void do() { }
}

class Y_ : public X_
{
}

И у меня есть эта функция:

void foo(X_ whatever)
{
  whatever.do();
}

Могу ли я отправить объект "Y_" в функцию foo, это сработает?

Я только что понял, что мог бы проверить это сам :) 1009 *

Ответы [ 2 ]

3 голосов
/ 22 мая 2010

Да, но он будет разрезан - все части Y_ объекта будут отрублены, и он станет X_. Обычно в этой ситуации вам нужно передавать по ссылке, так как обычно do () будет виртуальной функцией:

void foo(X_ & whatever)   // ampersand means whatever is a reference
{
  whatever.do();
}

Кстати, я не знаю, что вы думаете, эти суффиксные подчеркивания выигрывают вас, но я бы сказал "ничего".

1 голос
/ 22 мая 2010

Он будет работать, чтобы отправить его - да, но, как указывает Нейл, объект будет нарезан , то есть объект X_ будет создан на основе исходного объекта Y_.Несколько больший пример:

class Base
{
public:
    int func() { return 1; }
    virtual virtfunc () { return 2; }
}

class Derived
{
public:
    int func() { return 3; } // Shadows (hides) Base::func. Never do this!
    virtual int virtfunc() { return 4; }
}

int testfunc(Base b) { return b.func(); }
int testvirtfunc(Base b) { return b.virtfunc(); }
int testfuncbyref(Base& b) { return b.func(); }
int testvirtfuncbyref(Base& b) { return b.virtfunc(); }

void main()
{
    Base b;
    Derived d;

    b.func(); // returns 1
    b.virtfunc(); // returns 2
    d.func(); // returns 3
    d.virtfunc(); // returns 4.

    testfunc(d); // returns 1 because func is non-virtual.
    testvirtfunc(d); // returns 2 because a Base instance is created by the call.
    testfuncbyref(d); // returns 1 because func is non-virtual.
    testvirtfuncbyref(d); // returns 4 because the real d object is used and the function is virtual.
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...