如何分配/检索基类?

时间:2010-02-28 07:57:18

标签: c++ inheritance

假设我有:

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

无论如何都要做以下事情:

foo_part_of_bar(bar) = foo;

foo = foo_part_of_bar(bar);

谢谢!

5 个答案:

答案 0 :(得分:4)

显然,您的意思是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 :(得分:4)

假设您的意思是class Bar : public Foo,则以下内容应该有效。

foo_part_of_bar(bar) = foo;

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

foo = foo_part_of_bar(bar);

foo = bar;

答案 2 :(得分:1)

#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;
}

答案 3 :(得分:0)

从这里开始:C++ How come I can't assign a base class to a child class

对于foo_part_of_bar(bar)= foo; :

bar.Foo::operator=(foo);

和foo = foo_part_of_bar(bar);

foo = bar;

答案 4 :(得分:0)

引用基类,然后您可以对它进行任何操作,而不仅仅是分配给它。

plugin.path