繁体   English   中英

C ++纯虚方法重写

[英]C++ Pure virtual method override

我面临一个小问题,不知道在这种情况下该怎么做:我有第一个类(Object3D),它是Parent类

 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),在Teapot类中重新定义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
};

遵循这些更改之后,在main函数中,我仍然可以执行以下调用:

C->PrintObj(0);//A cube should be called with no arguments
T->PrintObj();//a teapot should be called only with arguments

我想避免的 我可以访问这些方法,尽管它们是私有的,因为我将对象动态声明为Object3D(我认为这是为什么?)

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

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};
    //..
    };

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM