Наследованный класс как поле класса

Есть код:

class A
{
    public:
        int c;
};

class B : public A
{};

int main()
{
    B a;
    a.c = 10;
    cout << a.A::c;
}

Насколько я понял, это что-то вроде восходящего преобразования. Правильное ли у меня понимание данного синтаксиса и есть ли еще какие-то способы апкастинга и даункастинга без ссылок и указателей в плюсах?


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

Автор решения: KoVadim

Класс B наследован от A и получает все от него в "наследство". Обычно, обращение таким данным "очевидно" для компилятора и он может "догадаться". Но иногда бывает не так. Посмотрите на такое

class A
{
    public:
        int c;
};

class B : public A
{
    public:
        int c;
};

В этом случае компилятор ругаться не будет, но что делать, если с функций класса B нужно обратится к переменной c класса A? Есть два способа - либо сделать функцию-прослойку (но ее нужно будет делать в классе A!, а это не всегда возможно), либо явно подсказать компилятору, что Вы хотите обратится к переменной класса A, используя такой синтаксис

B x;
x.c = 1; // это с класса B
x.A::c = 2; // а это с класса А

Насколько я понял, это что-то вроде восходящего преобразования.

нет, это просто уточнение для компилятора, что бы он точно понимал Ваши намерения.

апкастинга и даункастинга

это не имеет никакого отношения к преобразованию и приведению.

→ Ссылка