C++ почему вызывается родительский метод, когда у дочернего класса есть свой (метод)?

Есть вот такой код:


#include <iostream>

class computer {
    private: 
        int Vbp;
        std::string mthb;
        bool nameP; // 1 - Amd; 0 - intel;
    public: 
        computer () {
            Vbp = 500;
            mthb = "noName";
            nameP = 0;
        }

        void s_Vbp (int Vbp) {
            if (Vbp < 500) std::cout << "oh no" << std::endl;
            this->Vbp = Vbp;
        }
        void s_mthb (std::string mthb) {
            if (mthb == "BadW") std::cout << "oh no" << std::endl;
            this->mthb = mthb;
        }
        void s_nameP (bool nameP) {
            if (nameP != 0) this->nameP = nameP;
        }

        virtual void nst () {
            // std::cout << "V of the block power: " << Vbp << ", name of the motherboard: " << mthb << ", name of the proccesor: " << nameP << std::endl; 
            std::cout << "hello!!!!!!!!!!" << std::endl;
        }

};
class Ucomp : public computer {
    public:
     void nst () override {
            std::cout << "hello, im uwu"<< std::endl; 
        }
};

class UWcomp : public computer {
    public:
    void nst () override {
            std::cout << "hwllo, im owo" << std::endl; 
        }
};

int main () {
    computer comps[3];

    computer My;
    My.s_nameP(1);
    Ucomp His;
    His.s_mthb("Asrock");
    UWcomp Her;
    Her.s_Vbp(1000);

    comps[0] = His;
    comps[1] = My;
    comps[2] = Her;
    Her.nst();  
    
    int length = sizeof(comps) / sizeof(comps[0]);
    for (int i = 0; i < length; i++) {
        comps[i].nst();
    }

    return 0;
}

строка Her.nst(); выполняется как надо, она выводит hwllo, im owo НО! То, почему вы видите этот вопрос.

вывод for:

hello!!!!!!!!!!
hello!!!!!!!!!!
hello!!!!!!!!!!

почему такой вывод? разве он не должен быть следующим:

hello!!!!!!!!!!
hello, im uwu
hwllo, im owo

помогите пожалуйста, что не так?

p.s. попытки реализации полиморфизма


Ответы (1 шт):

Автор решения: Harry
computer comps[3];

Т.е. у вас происходит срезка потомков до предков.

Хотите полиморфизм? для этого нужны указатели/ссылки.

Посмотрите на вывод у этого кода:

computer * comps[3];

computer My;
My.s_nameP(1);
Ucomp His;
His.s_mthb("Asrock");
UWcomp Her;
Her.s_Vbp(1000);

comps[0] = &His;
comps[1] = &My;
comps[2] = &Her;
Her.nst();  

int length = sizeof(comps) / sizeof(comps[0]);
for (int i = 0; i < length; i++) {
    comps[i]->nst();
}
→ Ссылка