Получение интерфейса при помощи наследования

Уважаемые участники, что вы можете сказать по поводу такого кода:

#include <iostream>

class A {
public:
    int x = 2020;

    class B& GetInterface()
    {
            // ...
            // Тут на самом деле делается нечто.
            // Но это не важно для вопроса
        return (B&)(*this);
    }
};

class B : public A {
public:
    void f()
    {
        std::cout << x << std::endl;
    }
};

int main()
{
    A a;
    a.GetInterface().f();
    return 0;
}

Есть ли здесь неопределённое поведение? Является ли такой код допустимым, если в классе B нет переопределённых виртуальных функций класса A, данных - вообще ничего, кроме невиртуальных функций?


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

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

Тут есть неопределенное поведение при разыменовании ссылки, полученной из GetInterface, так как ссылка на самом деле не ссылается на объект типа B. Такой код является недопустимым независимо от содержимого класса B.

7.2.1 Value category [basic.lval]
...
11 If a program attempts to access (3.1) the stored value of an object through a glvalue whose type is not similar (7.3.5) to one of the following types the behavior is undefined:
(11.1) the dynamic type of the object
(11.2) a type that is the signed or unsigned type corresponding to the dynamic type of the object, or
(11.3) a char, unsigned char, or std::byte type.

→ Ссылка