在子类中使用父类的对象。您需要将对象作为类构造函数传递吗?

Posted

技术标签:

【中文标题】在子类中使用父类的对象。您需要将对象作为类构造函数传递吗?【英文标题】:Using an object of a parent class within a child class. Do you need to pass the object as a class constructor? 【发布时间】:2019-02-20 11:29:51 【问题描述】:

这很可能是一个重复的问题,但我无法找到解决此问题的最佳方法。

我有一个父类,它创建一个对象,该对象具有在该对象上操作的有用方法。然后我想创建一个子类,它通过引用获取父类的对象,并有一堆其他方法可以对其进行操作。

我想知道如何最好地解决这个问题?我应该将指向父类对象的指针作为子类的构造函数传递吗?

我想做的事:

class obj_parent
    initializes object
    virtual void method_1
    virtual void method_2


class operation: public obj_parent 
    void opertation_method_1(*object)
    void opertation_method_2(object)

如果父类和子类都被模板化会有什么不同呢?

我没有找到关于该主题的一些参考资料完全回答了我的问题,但可能有用。 Pass an object to a class constructor Passing object of a template class to constructor of another class

【问题讨论】:

您的措辞具有误导性和含糊不清。调用obj_parent 的可访问成员函数所需要的只是指向object_parent 实例的指针或引用(以及所需的任何参数)。 operations 如何获得这样的指针或引用并不重要——但它需要。如果成员函数不可访问,则没有办法(因为这是使成员函数不可访问的目的)。 对象在父类中是私有的还是受保护的(或公有的)? 尝试从不同的方向询问。你想做什么?你希望你的调用代码是什么样的?这可能会建议解决您的问题的最佳方法 对不起,含糊不清,我试图保持主题通用以避免投票,我是多态性/继承的相对初学者。我创建了一个矩阵类,然后有一个子类是求解器。它应该采用两个矩阵对象并求解方程组。矩阵类中有一些有用的方法,例如 print_matrix,所以我想将求解器类保留为矩阵的子类。但我只是不确定如何在求解器类中使用矩阵,而不必在创建求解器类的实例时重新初始化矩阵。 对象在父类中是公共的 【参考方案1】:

好的,下面的示例完全符合您的要求:子对象通过引用修改父对象的实例。父母持有一个单一的整数。是的,在现实生活中,一个对象通常会有多个成员变量,但这只是一个说明性示例。

class parentInt 
public:
    int memberNumber;
    parentInt(int number) 
        memberNumber = number;
    
    parentInt() 
        memberNumber = 0;
    
;

class childInt : public parentInt 
public:
    parentInt& mReferenceToParentObject;
    childInt(parentInt& referenceToParentObject) :mReferenceToParentObject(referenceToParentObject) 
    void addOne() 
        mReferenceToParentObject.memberNumber++;
    
    void subtractOne() 
        mReferenceToParentObject.memberNumber--;
    
;


int main()

    parentInt p(5); //parent int is 5
    childInt c(p); //child int is a reference to parent
    c.addOne();  // parent's memberNumber is now 6 because the child modified the parent through the reference
    c.subtractOne();  // parent's memberNumber is now 5 because the child modified the parent through the reference

如果您这样做是为了求解方程组(原始问题中未提及,请参阅 cmets),请将上面的 memberNumber 替换为向量向量以表示 2D 矩阵,然后将 addOne 更改为像高斯消元这样的算法来求解方程组。

【讨论】:

以上是关于在子类中使用父类的对象。您需要将对象作为类构造函数传递吗?的主要内容,如果未能解决你的问题,请参考以下文章

子类为啥要调用父类的构造函数

子类都会首先调用父类的构造函数吗?

在java语言里如何在子类中调用父类的有参构造函数

为啥java的子类中必须调用父类的构造方法

js原型继承的几种方法

定义子类对象时要先调用基类构造函数,是应该哪样理解呢