为派生 class 重载输出/输入运算符时,在派生 class 对象上调用基 class 方法是否正确?

Is it correct to call a base class method on derived class objects when overloading output / input operator for derived class?

假设我们有 2 classes "

class parent {
    
protected:
    float pr;
    
public:
    
     /// constructors, copy constructors, operator= overloading ...
     
     float get_pr() const
     {
         return pr;
     }
     
     friend ostream& operator<<(ostream& pout, const parent &obj1)
     {
         pout << obj1.get_pr() << '\n';
         return pout;
     }

};

class child: public parent {

protected:
    int age;
    
public:
    
     /// constructors & copy constructors using base class constructors, operator= overloading ...
     
     int get_age() const
     {
         return age;
     }
     
     friend ostream& operator<<(ostream& pout, const child &obj2)
     {
         pout << obj2.get_pr() << '\n';
         pout << obj2.get_age() << '\n';
         return pout;
     }

};

如您所见,在子 class 中,在 operator<< 重载代码中,我从基 class 调用一个方法。该程序有效,但对我来说,在 obj2 上调用该方法感觉不对(这是一个派生的 class 对象,它的 [=21] 中没有像 get_pr() 这样的方法=]).如果我在 base class 而不是那个 float pr 中动态分配内存,它仍然有效吗?

是否有另一种方法可以做类似的事情,或者这是唯一的方法?

嗯,这就是继承的基本思想。 child 是一个 parent,因此有一个方法 float get_pr() const。因此,从派生的 class.

调用基本 class 方法完全没问题

派生的 class(在您的情况下为 child)从它的 parent class 继承了所有内容,并且可以访问它的每个 public 和受保护的成员.