Как назначить / получить базовый класс? - PullRequest
4 голосов
/ 28 февраля 2010

Предположим, у меня есть:

class Foo {
  ...
};
class Bar : public Foo {
  ...
};
Foo foo;
Bar bar;

Есть ли в любом случае сделать следующее:

foo_part_of_bar(bar) = foo;

foo = foo_part_of_bar(bar);

Спасибо!

Ответы [ 5 ]

4 голосов
/ 28 февраля 2010

Предполагая, что вы имели в виду class Bar : public Foo, должно работать следующее.

Для foo_part_of_bar(bar) = foo;

*(static_cast<Foo *>(&bar)) = foo;

Для foo = foo_part_of_bar(bar);

foo = bar;
4 голосов
/ 28 февраля 2010

Очевидно, вы имеете в виду, что Bar является потомком Foo в иерархии классов ...

В этом случае выполнить первую часть можно двумя разными способами

// foo_part_of_bar(bar) = foo;
bar.Foo::operator =(foo);
(Foo &) bar = foo; // or use a C++-style cast

(Последнее может неправильно работать в экзотическом случае, когда соответствующий operator = объявлен виртуальным и переопределен в Bar. Но это, как я уже сказал, экзотично.)

Чтобы выполнить вторую часть, вам не нужно прилагать особых усилий

// foo = foo_part_of_bar(bar);
foo = bar;
// This is called slicing

Оба имеют очень ограниченное использование в некоторых очень особых контекстах. Интересно, для чего тебе это нужно ...

1 голос
/ 28 февраля 2010
#include <iostream>

struct Foo {
    Foo& operator=(const Foo&)
    {
        std::cout << "Foo::operator=\n";
        return *this;
    }
};
struct Bar : public Foo {
    Bar& operator=(const Bar&)
    {
        std::cout << "Bar::operator=\n";
        return *this;
    }
};

int main()
{
    Foo foo;
    Bar bar;

    Foo& foobar = bar;
    foobar = foo;

    foo = bar;

    return 0;
}
0 голосов
/ 01 марта 2019

Возьмите ссылку на базовый класс, и тогда вы сможете делать с ним все, что захотите, а не просто назначать ему.

    class Base {
        Base& operator=(const Base& other);
    };

    Base meow();

    class Derived : public Base {
        void woof()
        {
            Base& baseRef = *this;
            baseRef = meow();
        }
    };
0 голосов
/ 31 марта 2011

Отсюда: C ++ Почему я не могу назначить базовый класс дочернему классу

For foo_part_of_bar (bar) = foo;:

bar.Foo::operator=(foo);

и для foo = foo_part_of_bar (bar);

foo = bar;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...