将基对象返回到向上转换的派生类的最合适方法是啥?
Posted
技术标签:
【中文标题】将基对象返回到向上转换的派生类的最合适方法是啥?【英文标题】:What is the most suitable way to return base object to up-casted derived class?将基对象返回到向上转换的派生类的最合适方法是什么? 【发布时间】:2011-05-17 17:07:07 【问题描述】:struct B ; // B contains data members
struct D : B ; // D doesn't contain ANY data member
B g_b; // global object
D& fun () // want to return by reference ONLY
return <???>(g_b); // how ???
[注意:我想避免重载构造函数(或赋值),例如D(const B&)
。]
【问题讨论】:
【参考方案1】:您尝试做的事情是非法的。 g_b
不是 D
。
【讨论】:
g_b
你的意思是,但是是的。它只是B
的一个实例,而不是D
。没有通过D&
引用它的合法方式,因为D&
表示“引用D 的实例”。它不是:-)【参考方案2】:
没有合适的演员表。这实际上是未定义的行为。
详情请看本主题:Downcasting a base type
注意:当您将基类转换为派生类时,该术语是向下转换;当您将派生转换为基类时,使用术语 upcast。
【讨论】:
+1,通知upcast和downcast但是,我在问题中的意思是,我只是通过基类接收;该对象是已知类型(派生的)。这就是使用向上转换的原因。【参考方案3】:这是未定义的行为。
您可以使用dynamic_cast
将基类指针/引用安全向下转换为派生类指针/引用。如果是指针则返回 null,如果是引用则抛出异常。
【讨论】:
以上是关于将基对象返回到向上转换的派生类的最合适方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章