首先,我不完全确定如何标题我的问题。
我对继承有疑问。
假设我创建了一个名为Class_A的类:
class Class_A
{
public:
int a;
int b;
};
然后,我创建继承Class_A的Class_B:
class Class_B : public Class_A
{
public:
int c;
int d;
}
然后我创建了Class_B的实例:
Class_B my_class_b;
现在,我有一个函数,它接受一个Class_A的实例,更改它,然后返回一个Class_A:
Class_A func (Class_A which)
{
which.a += 20;
which.b -= 20;
return which;
}
我想要完成的是,我希望能够将任何Class_A传递给函数,然后将更改分配给传递给它的任何内容。
我试过这个:
Class_A temp = func (my_class_b);
my_class_b = temp;
将my_class_b传递给Class_A可以正常工作,但是将其分配回my_class_b不会。
我得到了:
no match for 'operator=' in 'my_class_b = temp'
这样做的最佳方法是什么?谢谢你的帮助。
答案 0 :(得分:3)
将func更改为:
void func (Class_A& which)
{
which.a += 20;
which.b -= 20;
}
并像
一样使用它func(my_class_b);
答案 1 :(得分:1)
没有一种最好的方法可以做到这一点。
使用类func
的对象调用B
时,对象首先转换为A
类型(所谓的slicing problem),这可能已经不可接受了。因此,修复代码的一种方法是修复使用func
函数的方式。
例如,将其设为公共虚拟成员函数:
class Class_A
{
public:
virtual void func() {...}
...
}
my_class_b.func(); // instead of Class_A temp = func (my_class_b); my_class_b = temp;
另一种方法:make func
修改现有对象,而不是创建新对象:
void func(A& object) {...}
...
func(my_class_b); // instead of Class_A temp = func (my_class_b); my_class_b = temp;
如果您想使用赋值语法,并且您确定切片不是代码的问题(不太可能),您可以为class B
定义赋值运算符:
class B {
B& operator=(A object) {a = object.a; b = object.b; return *this;}
...
}
或者(更好)添加一种方法来构建来自B
的{{1}}:
A
答案 2 :(得分:1)
一种方法是:您必须在Class_b中重载运算符以复制Class_a的值。 第二种方法是:使用static_cast(temp),但这种方法并不总是安全的。