【问题标题】:C++ Pure virtual method overrideC++ 纯虚方法覆盖
【发布时间】: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


【解决方案1】:

解决方案非常简单。您需要将第二种方法设为私有。

class Cube : public Object3D
{
    public:
    Cube(unsigned char c):Object3D(c){};
       ~Cube(){};
    void PrintObj();
    private:
     void PrintObj(double d);
     };

class Teapot : public Object3D
    {
    public:
        Teapot(unsigned char c):Object3D(c){};
        ~Teapot(){};
        void PrintObj(double s){//Code};
    private:
        void PrintObj(){//Code};
    //..
    };

【讨论】:

  • 谢谢,但这样做仍然允许我调用错误的 PrintObj() 方法。例如,如果我声明一个 Cube C,我仍然可以使用这段代码 C.PrintObj(1),这是我想避免的:/.
  • 你不能,因为 void PrintObj(double d) 是私有的。您只能在类体内使用此方法。
  • 我可以调用,因为当我声明我的对象时,我是这样动态调用的:Object3D *C = new Cube(250); // 250 代表颜色;
猜你喜欢
  • 2012-04-02
  • 2020-08-21
  • 2012-02-19
  • 2018-11-16
  • 2018-06-02
  • 2018-08-01
  • 2011-05-21
  • 2021-09-30
  • 2011-03-31
相关资源
最近更新 更多