【发布时间】:2015-01-24 03:41:35
【问题描述】:
我的问题有点冗长。请在您完成整个问题后才回答它。
我已经按如下方式实现了钻石问题:
class Polygon
{
protected:
int sides;
public:
Polygon()
{
cout << "Polygon's Default Constructor being called." << endl;
}
Polygon(int a)
{
cout << "Polygon's parameterized Constructor being called." << endl;
sides = a;
}
void virtual Draw()
{
cout << "Polygon being drawn." << endl;
}
virtual ~Polygon()
{
cout << "Polygon's Destructor being called." << endl;
}
};
class Triangle : virtual public Polygon
{
int Angles[3];
public:
Triangle()
{
cout << "Triangle's Default Constructor being called." << endl;
}
Triangle(int a)
{
cout << "Triangle's parameterized Constructor being called." << endl;
sides = a;
}
Triangle(int a, int b) : Polygon(a)
{
cout << "Triangle's double parameterized Constructor being called." << endl;
//sides = a;
}
void virtual Draw()
{
cout << "Triangle being drawn." << endl;
}
~Triangle()
{
cout << "Triangle's Destructor being called." << endl;
}
};
class IsoscelesPolygon : virtual public Polygon
{
void virtual Draw()
{
cout << "Isosceles Polygon's Draw Called." << endl;
}
};
class IsoscelesTriangle : public Triangle, public IsoscelesPolygon
{
void Draw(int )
{
cout << "Isoceles Triangle's Draw() Called." << endl;
}
};
它工作得很好,并解决了由于虚拟继承而导致的 Diamond 问题。但是当我将IsocelesTriangle 中的Draw() 更改为Draw(int) 时,它开始给我这样的错误:
当我将Polygon 中的Draw() 设为非虚拟时,不会弹出此错误并且程序成功运行(显然以非多态方式)。为什么?它与Draw()在IsocelesTriangle中的签名有什么联系(基类中的virtual函数)?
【问题讨论】:
标签: c++ inheritance polymorphism overloading