Переопределение классов с ++

0

Скажем, у меня есть этот код, который я НЕ МОЖЕТ изменить:

ах

 class B;
 class A
{
  A();
  void * getB();
  private:
  B * b;
}

A.cxx

namespace
{
    class B : public QTabWidget
    {
        foo()
        {
         ...
        }
        bar()
        {
         ...
        }
    }
}
A::A()
{
    b = new B();
}
A::getB()
{
    return b;
}

Я хочу получить доступ к b и его методам (foo или bar или унаследованным методам) в классе, который наследует A. Могу ли я это сделать?

Ch

class C : public A
{
  C();
  private:
  D * d;
}

C.cxx

namespace
{
    class D : public QTabWidget //Exact copy of class B
    {
        foo()
        {
        ... 
        }
        bar()
        {
        ...
        }
    }
}
C::C()
{
    d = (D*) getB();
    d.foo()
    d.bar()
}

Это безопасно? Это разрешено? Я пробовал, и, похоже, он работает. Если это безопасно, могу ли я расширить D с помощью более статических методов или методов или даже атрибутов?

  • 0
    С точки зрения компилятора это будет работать, потому что это простая копия типа D Но с точки зрения проектирования я не знаю, разрешено ли это.
Теги:
inheritance

1 ответ

1
Лучший ответ

Нет, это не безопасно.

Теоретически вы можете заставить его работать, если первая часть D идентична B Возможно, вы, возможно, добавите новые вещи в D

На практике, однако, это обычно очень плохая идея. Вы полагаетесь на то, чтобы вручную синхронизировать классы друг с другом. Что еще более важно, вы полагаетесь на компилятор, который обрабатывает оба класса точно так же, что может зависеть от различных параметров конфигурации (например, упаковки).

Если вы совершите малейшую ошибку, вы получите неопределенное поведение, потому что программа может получить доступ или выполнить что-то произвольное. Крайне важно, что это может показаться сработавшим какое-то время, а затем внезапно неожиданно неожиданно неожиданно разразится. Эта проблема может быть очень сложной для отслеживания, потому что вы намеренно обходите проверку типа компилятора.

  • 0
    Ну что я мог сделать? Мне нужен доступ к этому классу. Я также могу включить A.cxx в C.cxx, но я получаю предупреждение: warning: '..' имеет поле '...', тип которого использует анонимное пространство имен. это лучшая идея?
  • 0
    Я согласен с частью "syncing class". Но если учесть, что в этом дублированном классе вообще нет атрибутов, может ли он сломаться в любое время? Если я вызову d.foo (), какой двоичный код выполняется? тот, который производится из B ou D?
Показать ещё 5 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню