将对象投射到父级

Posted

技术标签:

【中文标题】将对象投射到父级【英文标题】:Cast object to parent 【发布时间】:2014-04-15 19:32:54 【问题描述】:

我在 C++ 中遇到了继承问题。这是我想做的:

class parent

   public:
   int a;
;

class son : public parent

   public:
   int b;
   operator parent()
   
      parent p; p.a = a + b;
      return p;
   



void funct(parent a)

    cout<<a.a;


son s; s.a = 3; s.b = 4;
funct(s);

我希望它打印出 7。相反,强制转换是隐式完成的,不会影响任何事情,并且打印出 3。谁能给我一个关于如何做到这一点的建议?这甚至可能吗?

【问题讨论】:

如果所有成员都是public,为什么不使用struct A sonparent,因此您的演员阵容永远不会被调用。 如果你使用protectedprivate继承,事情可能会改变。 我会尝试虚拟功能 PS。受保护或私有继承无济于事 @Deduplicator 感谢您的提示,但它不起作用。它说“父母是儿子无法接近的基地”.. 【参考方案1】:

根据 C++ 标准

转换函数从不用于转换 a(可能 cv 限定)对象到(可能 cv 限定)相同的对象类型 (或对它的引用),到(可能是 cv 限定的)基类 该类型(或对它的引用),或(可能是 cv 限定的)void。

您可以使用输出数据成员的虚函数,也可以将运算符

例如

class parent

   public:
   virtual std::ostream & out( std::ostream &os ) const  return os << a; 
   int a;
;

class son : public parent

   public:
   int b;
   std::ostream & out( std::ostream &os ) const  return os << a + b; 
;

std::ostream & operator <<( std::ostream &os, const parent &obj )

   return obj.out( os );

【讨论】:

@Deduplicator 但我认为他不想将每个函数写成两个具有 parent & 类型参数的函数。 我相信你是对的,这就是我已经投票的原因。只是为了完整性而提及它。【参考方案2】:

这是 7 的打印方式:

funct(s.operator parent());

还有一点要记住:

funct(s) // 将导致对象切片,因为 'funct' 按值获取基类对象。

【讨论】:

【参考方案3】:

对象通过这样的方法自动转换为父类:

operator base_type&() return (base_type&)*this;

您无法更改此方法。

您只能将继承更改为受保护或私有。编译器从不进行隐式转换,即使您定义了转换运算符。

您只能编写一个普通的方法来执行该转换并在需要时调用它。

【讨论】:

以上是关于将对象投射到父级的主要内容,如果未能解决你的问题,请参考以下文章

将 vue.js 组件子中的对象或值发送到父通信

包含到父级的JQuery Draggable和额外的一个

Vuejs 中从子级到父级的事件监听

Jquery常用代码

如何通过仅膨胀一次将相同的视图多次添加到父级

先看看解析,事件委托:也称事件代理 就是利用冒泡的原理 把加事件加到父级上,触发执行效果