Полиморфизм не может быть переопределен при использовании строки - PullRequest
0 голосов
/ 28 мая 2019

Polymorphism в декабре C, не работает со строкой

Я использую Dev C++ 5.9.2.

У меня есть родительский класс A, класс B,C,D,E ..... extends A и класс list - это основной класс, в котором я использую B,C,D.

Я не использую родительский A, потому что я хочу повторно использовать конструктор A.

Проблема в следующем

class A
{
    public:
    virtual void show(){
            printf("A");
        }
    private:    
    string tokenS;

};

class B :public A
{
    public:
    virtual void show(){
        printf("B:");
       // return 0;
    }
}

class list
{
    public:
        A* getNode(){
           return pta;
        }

        void setNode(B temp){
           this->pta=&temp;
        }
    protected:
    private:
        A *pt1;
};
int main(){
    list ls;
    B b1;
    ls.setNode(b1);
    ls.getNode()->show();
}

, если я использую string tokenS результат: A

, если я использую char* tokenS результат: B:

Я не понимаю этого, и если я создаю класс и использую его, у меня та же ошибка

class Date
{
   // code
};

class A
    {
        public:
        virtual void show(){
                printf("A");
            }
        private:    
        Date day;

    };

 class B :public A
    {
        public:
        virtual void show(){
            printf("B:");
           // return 0;
        }
    }

1 Ответ

0 голосов
/ 28 мая 2019

Проблема здесь:

    void setNode(B temp){
       this->pta=&temp;
    }

Это устанавливает pta для указания temp, но temp больше не существует, когда функция заканчивается.Вот способ исправить это и сохранить полиморфизм:

class A
{
    public:
    virtual void show(){
            printf("A");
        }
    virtual std::unique_ptr<A> clone() = 0;
    private:    
    string tokenS;

};

class B :public A
{
    public:
    virtual void show(){
        printf("B:");
       // return 0;
    }
    virtual std::unique_ptr<A> clone()
    {
        return std::make_unique<B>(*this);
    }
};

class list
{
    public:
        A& getNode(){
           return *pt1;
        }

        void setNode(A& temp){
           pt1 = temp.clone();
        }
    protected:
    private:
        std::unique_ptr<A> pt1;
};
int main(){
    list ls;
    B b1;
    ls.setNode(b1);
    ls.getNode().show();
}
...