【发布时间】:2015-07-08 11:45:55
【问题描述】:
我遇到了一个小问题,不知道在这种情况下该怎么办: 我有这个第一类(Object3D),它是父类
Object3D{
public:
Object3D(){};
virtual ~Object3D(){};
///RANDOM METHODS
virtual void PrintObj() = 0;
virtual void PrintObj(double) = 0;
//etc..
private:
//..
};
如您所见,我有被覆盖的 PrintObj() 方法。有些对象不带参数,比如在这个子类中
class Cube : public Object3D
{
public:
Cube(unsigned char c):Object3D(c){};
~Cube(){};
void PrintObj();
private:
//..
};
而其他类需要一个参数来调用 PrintObj 方法
class Teapot : public Object3D
{
public:
Teapot(unsigned char c):Object3D(c){};
~Teapot(){};
void PrintObj(double s){//Code};
private:
//..
};
问题是这两个类是自动抽象的,它们从父类继承了纯虚方法。
我考虑过重新定义立方体类中的 PrintObj(double) 和茶壶类中的 PrintObj() 类,但这将允许用户调用“错误”的 PrintObj() 方法。
编辑:我将稍微解释一下我所说的“错误的” PrintObj();
在主函数中我动态声明了这个立方体:
Object3D *C = new Cube(250);
还有这个茶壶,动态的:
Object3D *T= new Teapot(250);
现在如果我这样改变我的课程:
class Cube : public Object3D
{
public:
Cube(unsigned char c):Object3D(c){};
~Cube(){};
void PrintObj();
private:
void PrintObj(double){};// i add this method here in private
};
对于茶壶:
class Teapot : public Object3D
{
public:
Teapot(unsigned char c):Object3D(c){};
~Teapot(){};
void PrintObj(double s){};
private:
void PrintObj(){};//i add this method here in private
};
随着这些变化,在主函数中我仍然可以进行这些调用:
C->PrintObj(0);//A cube should be called with no arguments
T->PrintObj();//a teapot should be called only with arguments
我想避免的;我可以访问这些方法,尽管它们是私有的,因为我将对象动态声明为 Object3D(我认为这就是为什么?)
【问题讨论】:
-
可能为参数添加默认值?或重命名方法之一 (PrintScaledObj(double)?) ?
-
这个
double的目的是什么?应该是成员函数吗? -
@Hcorg ,我考虑过重命名它,但我宁愿对所有类保持相同的方案:/。
-
@Jarod42 ,在 PrintObj(double) 方法中,我需要调用一个使用双参数的函数,但在 PrintObj() 方法中,我不使用相同的函数,因此存在差异.
-
@HdjoWattever: 不是很清楚 :-( 而我可能理解
Object3D::PrintObj(),这是Object3D::PrintObj(double)中的double? scaling, distanceToSomething, CaptainAge ?
标签: c++ methods overriding abstract