将对象投射到父级
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 son
是 parent
,因此您的演员阵容永远不会被调用。
如果你使用protected
或private
继承,事情可能会改变。
我会尝试虚拟功能 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;
您无法更改此方法。
您只能将继承更改为受保护或私有。编译器从不进行隐式转换,即使您定义了转换运算符。
您只能编写一个普通的方法来执行该转换并在需要时调用它。
【讨论】:
以上是关于将对象投射到父级的主要内容,如果未能解决你的问题,请参考以下文章