我在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。谁能给我一个如何做到这一点的建议?这甚至可能吗?
答案 0 :(得分:2)
根据C ++标准
转换函数永远不会用于转换 a(可能是 cv-qualified)对象(可能是cv-qualified)相同的对象类型 (或对它的引用),到(可能是cv认证的)基类 该类型(或对它的引用),或(可能是cv-qualified)void。
您可以使用输出数据成员的虚拟函数,也可以定义运算符&lt;&lt;作为类的伪虚拟(即调用虚函数)。
例如
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 );
}
答案 1 :(得分:0)
这就是7的印刷方式:
funct(s.operator parent());
要记住一点:
funct(s)
//会导致对象切片,因为'funct'按值获取基类对象。
答案 2 :(得分:0)
Object通过以下方法自动转换为父类:
operator base_type&() {return (base_type&)*this;}
您无法更改此方法。
您只能将继承更改为protected或private。编译器永远不会进行隐式转换,即使您定义了转换操作符。
您只能编写一个普通方法,可以在需要时进行转换并调用它。