TransWikia.com

Как обратится к полю конкретного прародителя из наследника?

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 различных переменных. А как обратится к каждому из них?

2 Answers

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

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP