Stack Overflow на русском Asked by Learpcs on August 30, 2021
Вот код описывающий суть моей проблемы:
#include <iostream>
struct parent
{
int quality = 1;
};
struct succesor : parent
{
int quality = 2;
};
struct grandsuccesor : succesor
{
int quality = 3;
};
int main()
{
grandsuccesor example;
std::cout << example.quality << std::endl << sizeof(example);
}
Вывод программы:
3
12
То есть поле example.quality
выбирается из самого класса, а не родителя. Но как обратится конкретно, допустим, к полю parent quality? Ведь sizeof(example) = 12
, а значит все таки выделяется 3 различных переменных. А как обратится к каждому из них?
std::cout << example.parent::quality << 'n';
std::cout << example.succesor::quality << 'n';
А если написать example.grandsuccesor::quality
, то это будет эквивалентно просто example.quality
.
Есть еще вариант - скастовать класс в ссылку на родителя, и обратиться к полю:
static_cast<parent &>(example).quality
Методы так тоже можно вызывать.
Но у первого способа есть особенность - он игнорирует виртуальность методов. То есть если написать x.Родитель::Метод()
, то вызовется именно метод родителя, даже если он виртуальный и был переопределен.
Correct answer by HolyBlackCat on August 30, 2021
Можно обратиться путем частичного разыменования:
int main()
{
grandsuccesor example;
succesor *ptr_succesor = &example;
parent *ptr_parent = &example;
std::cout << example.quality << std::endl << ptr_succesor->quality << std::endl << ptr_parent->quality;
}
Answered by OnuchinVA on August 30, 2021
Get help from others!
Recent Questions
Recent Answers
© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP