В C++ статический и динамический тип объекта, на который указывает указатель, могут различаться.
Ваш статический тип того, на что указывают общие указатели в этом векторе, — Account
.
Динамический тип того, на что указывают общие указатели в этом векторе, различается. В вашем случае вы помещаете в него Businessaccount
.
Когда вы хотите получить доступ к методам или вызвать их, вам предоставляется доступ только к методам статического типа.
Статический тип — это то, что вы доказали компилятору, тип которого содержится в этой строке.
Если вы знаете лучше, вы можете сделать static_cast<Businessaccount*>(vec.at(0).get())->getx()
. Делая это, вы обещаете компилятору, что у вас есть определенные сведения о том, что данные в этом месте на самом деле являются Businessaccount
. Если вы ошибаетесь, поведение вашей программы не определено (если вам повезет, вы получите сбой).
Вы также можете использовать RTTI (информация о типе времени выполнения), чтобы спросить, является ли конкретный объект определенным подтипом (в некоторых случаях, когда базовый класс имеет виртуальный метод).
Account* paccount = vec.at(0).get();
Businessaccount* pba = dynamic_cast<Businessaccount*>(paccount);
if (pba)
pba->getx();
приведенный выше проверяет, является ли paccount
на самом деле Businessaccount*
, и если это так, вызывает для него getx
. Если нет, то ничего не делает.
Часто динамическое приведение является признаком того, что вы неправильно спроектировали использование объекта; необходимость углубляться в интерфейс, реализация которого означает, что, возможно, ваш интерфейс недостаточно богат.
В некоторых языках сценариев и компиляции байт-кода они позволяют вам уйти и вызвать getx
и перейти к сбою/сгенерировать исключение/и т. д., если этого метода нет.
Вместо этого C++ позволяет вам использовать то, что вы утверждали (через систему типов), а затем позволяет вам написать свой собственный обработчик, если вы хотите динамическую проверку типов.
person
Yakk - Adam Nevraumont
schedule
12.05.2017
at()
, не может быть напрямую использован для доступа к функциям-членам производных классов. - person MikeMB   schedule 12.05.2017Account
член по имениgetx()
? - person David Schwartz   schedule 12.05.2017->
.vect.at(0)->getx();
. - person François Andrieux   schedule 12.05.2017