为派生 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 和受保护的成员.
假设我们有 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(在您的情况下为 child
)从它的 parent
class 继承了所有内容,并且可以访问它的每个 public 和受保护的成员.