gpt4 book ai didi

c++ - 具有引用成员变量的多态性

转载 作者:行者123 更新时间:2023-11-30 02:27:28 35 4
gpt4 key购买 nike

有人能告诉我下面的程序有什么问题吗?我在类中使用引用成员变量来实现多态性。我期待第二个 cout 说“derived2”,但它说“base”;

#include <iostream>

// Example program
#include <iostream>
#include <string>
class base
{
public:
virtual void print(){ std::cout<<"base"<<std::endl;}
};
class derived: public base
{
public:
virtual void print(){ std::cout<<"derived"<<std::endl;}
};

class derived2: public base
{
virtual void print(){ std::cout<<"derived2"<<std::endl;}
};

class foo
{
public:
base & bar;
base boo;
derived foobar;
derived2 foobar2;
foo(): bar(boo){}
void newfoo(base & newfoo){ bar = newfoo; bar.print();}
};
int main()
{
foo test;
test.bar.print();
test.newfoo(test.foobar2);
}

输出: 根据 基地

最佳答案

正如其他人所提到的,您不能重新分配引用。
每当您执行类似 bar = newfoo 的操作时,您都不会重置引用。相反,您使用 newfoo 作为参数为 bar 调用 operator=
因此,在您的情况下,您正在切片您的对象并(让我说)在 bar 中复制其 base 部分。


标准模板库中存在一种可以重新分配的类似引用的工具,它称为 std::reference_wrapper
它遵循一个基于您的代码的示例,该示例使用它并具有预期的行为:

#include<functional>
#include <iostream>
#include <string>

class base
{
public:
virtual void print() { std::cout<<"base"<<std::endl;}
};
class derived: public base
{
public:
virtual void print(){ std::cout<<"derived"<<std::endl;}
};

class derived2: public base
{
virtual void print(){ std::cout<<"derived2"<<std::endl;}
};

class foo
{
public:
std::reference_wrapper<base> bar;
base boo;
derived foobar;
derived2 foobar2;
foo(): bar(boo){}
void newfoo(base & newfoo){ bar = newfoo; bar.get().print();}
};
int main()
{
foo test;
test.bar.get().print();
test.newfoo(test.foobar2);
}

在这种情况下,operator= 实际上重新绑定(bind)了对给定对象的引用。无论如何,如您所见,在这种情况下,您必须调用 get 来访问底层引用。

注意:抛开上面的示例,您的代码不是 std::reference_wrapper 的典型用例。
我提到它只是为了完整起见。

关于c++ - 具有引用成员变量的多态性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41751246/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com