концепция базы, вывести класс и правильно их использовать - PullRequest
0 голосов
/ 23 октября 2019

Вы должны использовать концепцию базы, вывести класс и использовать их правильно. при этом я столкнулся с некоторыми проблемами. Можете ли вы помочь мне решить проблемы?

Мой код:

#include <iostream>


class Base {
    public:
    Base (int data) : _data(data){}
    virtual void printData(){
        std::cout << "Base" << _data << std::endl;
    }

private:
    int _data;
};

class Derived : public Base {
    public:
    Derived(derivdata) : Base(derivdata){}
    void printData(){
        cout << "Derived " << _data << endl;
    }
}


int main(){
    Derived *var = new Derived(5);
    var-> printData();
    Base* basevar = static_cast<Base>(*var);
    basevar-> printData();
}

Ответы [ 2 ]

0 голосов
/ 23 октября 2019

Здесь есть несколько проблем, которые могут быть опечатками:

  • пропущенная точка с запятой после класса Derived
  • в конструкторе Derived(derivdata) : Base(derivdata){} типа derivdataпропал, отсутствует. (в c ++ отсутствует int по умолчанию)
  • вам не хватает пространства имен std:: перед cout и endl в Derived::printData
  • в Derived::printData элемент _dataнедоступен, потому что он закрыт для Base (Вы можете сделать его защищенным или написать для него геттер)

Основная проблема заключается в следующем приведении: Base* basevar = static_cast<Base>(*var); Это фактически разыменовывает значениеиз var, затем попытайтесь привести это значение к Base, а затем попытайтесь присвоить результат (типа Base) переменной типа Base*.

Для полиморфного преобразования вы можетеиспользуйте dynamic_cast : Base* basevar = dynamic_cast<Base*>(var);

Но не ожидайте, что basevar->printData(); напечатает «Base», так как указатель все еще указывает на экземпляр Derived и метод объявленvirtual.

Чтобы получить доступ к методу базового класса, вам нужно явно указать компилятору сделать это: basevar->Base::printData(); (печатает "Base5")

0 голосов
/ 23 октября 2019

Base* basevar = static_cast<Base>(*var); неверно,
это будет Base* basevar = static_cast<Base*>(var);
, но достаточно Base* basevar = var;.

и версия без утечки памяти:

int main(){
    Derived derived(5);
    derived.printData(); // "Derived 5\n"
    Base& base = *derived;
    base.printData();    // "Derived 5\n" as method is virtual
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...