遗产。如何让孩子=父母

时间:2014-08-03 17:12:24

标签: c++ inheritance

首先,我不完全确定如何标题我的问题。

我对继承有疑问。

假设我创建了一个名为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'

这样做的最佳方法是什么?谢谢你的帮助。

3 个答案:

答案 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),但这种方法并不总是安全的。