将基对象返回到向上转换的派生类的最合适方法是啥?

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&amp;)。]

【问题讨论】:

【参考方案1】:

您尝试做的事情是非法的。 g_b 不是 D

【讨论】:

g_b 你的意思是,但是是的。它只是B 的一个实例,而不是D。没有通过D&amp; 引用它的合法方式,因为D&amp; 表示“引用D 的实例”。它不是:-)【参考方案2】:

没有合适的演员表。这实际上是未定义的行为。

详情请看本主题:Downcasting a base type

注意:当您将基类转换为派生类时,该术语是向下转换;当您将派生转换为基类时,使用术语 upcast

【讨论】:

+1,通知upcast和downcast但是,我在问题中的意思是,我只是通过基类接收;该对象是已知类型(派生的)。这就是使用向上转换的原因。【参考方案3】:

这是未定义的行为。 您可以使用dynamic_cast 将基类指针/引用安全向下转换为派生类指针/引用。如果是指针则返回 null,如果是引用则抛出异常。

【讨论】:

以上是关于将基对象返回到向上转换的派生类的最合适方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章

我们可以将基类的私有成员继承到派生类的公共成员中吗?

将基类的对象传递给派生类的引用函数

什么时候在 C++ 中向上转型是非法的?

一种将基类型转换为派生类型的方法

将基类指针强制转换为子类指针后的疑惑

向上强制转换和向下强制转换