继承.如何做一个孩子=父母

Inheritance. How to make a child = parent

本文关键字:父母 孩子 何做一 继承      更新时间:2023-10-16

首先,我不太确定如何给我的问题命名。

我有一个关于继承的问题。

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

我得到a:

no match for 'operator=' in 'my_class_b = temp'

做这件事的最好方法是什么?谢谢你的帮助。

change function to:

void func (Class_A& which)
{
    which.a += 20;
    which.b -= 20;
}

,像

一样使用
func(my_class_b);

一种方法是:必须重载Class_b中的操作符来复制Class_a的值。第二种方法是:使用static_cast (temp),但这种方法并不总是安全的。

没有唯一最好的方法。

当用B类的对象调用func时,该对象首先被转换为A类型(所谓的切片问题),这可能已经是不可接受的。因此,修复代码的一种方法是修复使用func函数的方式。

例如,将其设为public虚成员函数:

class Class_A
{
    public:
        virtual void func() {...}
    ...
}
my_class_b.func(); // instead of Class_A temp = func (my_class_b); my_class_b = temp;

另一种方法:让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;}
    ...
}

或者(更好)添加一种从A构造B的方法:

class B {
    B(A object): A(object), c(0), d(0) {}
    ...
}