假设我有:
class Foo {
...
};
class Bar : public Foo {
...
};
Foo foo;
Bar bar;
无论如何都要做以下事情:
foo_part_of_bar(bar) = foo;
foo = foo_part_of_bar(bar);
谢谢!
答案 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