C ++纯虚方法覆盖

时间:2015-07-08 11:45:55

标签: c++ methods override abstract

我遇到一个小问题而且不知道在这种情况下该怎么做: 我有第一个类(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();

在main函数中,我已动态声明了这个立方体:

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(我认为这就是为什么?)

1 个答案:

答案 0 :(得分:0)

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

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