C ++:友元函数,派生类

时间:2012-07-20 11:26:27

标签: c++ inheritance derived-class

我有2个类,基类是“Port”,派生类是“VintagePort”。 据我所知,如果我使用基类的引用或指针到派生类的对象,它会自动找到正确的方法,而不是引用或指针,但完全对象(如果方法是虚拟的)。

在我的情况下,您可以看到两个类都有友元函数“operator<<”。但是看起来当我使用指针作为基类时,它只从基类调用函数。如果我使用“cout<< VintagePort”它可以正常工作。 我的问题:它是否正常工作或我应该在代码中修复一些东西?

std::ostream& operator<<(std::ostream& os, const Port& p)
{
os << p.brand << ", " << p.style << ", " << p.bottles << endl;
return os;
}

std::ostream& operator<<(std::ostream& os, const VintagePort& vp)
{
os << (const Port &) vp;
cout << ", " << vp.nickname << ", " << vp.year << endl;
return os;
}




VintagePort vp1;
VintagePort vp2("Gallo", "lekko brazowy", 50, "Blaze", 1990);
VintagePort vp3(vp2);

Port* arr[3];
arr[0] = &vp1;
arr[1] = &vp2;
arr[2] = &vp3;

for (int i = 0; i < 3; i++)
{
    cout << ">>>>> " << i+1 << " <<<<<" << endl;
    cout << *arr[i];   // call for base class instead derived class
    arr[i]->Show();    
}

2 个答案:

答案 0 :(得分:5)

编译器现在指针实际上并不指向继承的类。解决此问题的一种方法是在基类中使用虚函数进行输出,并在继承基类的类中覆盖它。然后在输出运算符中调用此虚方法。

答案 1 :(得分:0)

在C ++中,多态性只能通过虚函数来实现,并且operator<<不是一个(并且不能用于您的目的,因为第一个参数是std::ostream。如果您需要这种类型行为方面,简单的方法是在层次结构中提供虚拟打印功能,并operator<<转发执行动态调度的调用:

struct base {  // Don't forget virtual destructors
   virtual void print( std::ostream& ) const;
};
struct derived : base {
   virtual void print( std::ostream& ) const;
};
std::ostream& operator<<( std::ostream& o, const base& b ) {
   b.print( o );
   return o;
}