Мне нужно получить доступ к члену производного класса через статическую переменную базового класса - PullRequest
1 голос
/ 15 февраля 2012

Мне нужно получить доступ к производной переменной-члену класса через переменную базового класса.

Class A{

};

Class B:public A {
  int data;  
};

Теперь мне нужно сделать что-то вроде этого

A *pb = new B()
pb->data = 10;

но проблема в том, что я не могу получить доступ к производному классу-члену без него.

и да, я знаю, как заставить его работать с виртуальными функциями.

Спасибо, я очень ценю вашу помощь.

Ответы [ 3 ]

2 голосов
/ 15 февраля 2012

Без виртуальных функций единственное, что вы можете сделать, - это преуменьшить его.Есть несколько способов сделать это:

  • Вы можете использовать dynamic_cast, если у вас включен RTTI И у вас есть хотя бы одна виртуальная функция в родительском классе, которая позволит вам проверить, является ли приведениеуспешно или нет.
  • static_cast позволит вам разыграть что-то ниже вашего дерева наследования, но вы потеряете способность проверять, удалось ли это.
  • Вы также можете полностью сбросить осторожность с ветра.и используйте бросок в стиле C.
2 голосов
/ 15 февраля 2012

Необходимость указывает на неисправный дизайн.

Но если вы действительно настаиваете на написании плохого кода, вы можете просто привести обратно к B *.

1 голос
/ 15 февраля 2012

Краткий ответ: Вы не можете.Потому что ваш компилятор не знает, что такое pb.это может быть типа A.Однако вы используете dynamic_cast, который возвращает указатель B или NULL, если это невозможно.

A *pa = new B();
B *pb = dynamic_cast<B*>(pa);
if (pb) {
    pb->data = 10;
}
else {
    ...
}

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...