Доступ к переменным-членам объекта производного класса, на который указывает указатель на его базовый класс - PullRequest
1 голос
/ 01 сентября 2009

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

Теперь я хочу получить доступ к переменной-члену производного класса (эта переменная отсутствует в базовом классе), используя указатель на базовый класс, который указывает на объект производного класса.

Можно ли это сделать? Должно ли это быть сделано?

Ответы [ 4 ]

7 голосов
/ 01 сентября 2009

Почему вы хотите получить доступ к интерфейсу производного класса? Когда вы используете полиморфизм, вам не нужно заботиться о том, что стоит за ссылкой / указателем базового класса. Если да, то это обычно намек на недостаток дизайна.

То, что вы пытаетесь сделать, это "тип включения". («Если позади B* находится D1 объект, сделайте это, иначе сделайте это».) Тип включения обходит полиморфизм и является плохим признаком.

Примечание: есть способ сделать это (dynamic_cast), но по причинам, упомянутым выше, я рассматриваю эту плохую практику и не буду останавливаться на ней.

1 голос
/ 01 сентября 2009

Напишите виртуальную функцию, которая будет действовать соответственно в каждом из классов и в том месте, где вам действительно «нужен» доступ к переменной - вызовите эту функцию. Это так просто.

1 голос
/ 01 сентября 2009

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

Например, если у вас есть базовый класс, называемый Base, и два производных класса Derived1 и Derived2, и если у вас есть указатель Base* p, то вы можете сделать:

Derived1* d1 = dynamic_cast<Derived1*>(p);
0 голосов
/ 01 сентября 2009

Просто переместите эту переменную в базовый класс. Единственный случай, когда базовому классу необходимо вызывать методы (или использовать переменные) класса Derived, это Любопытно повторяющийся шаблон , когда он реализует статический полиморфизм. В других случаях это выглядит как плохой дизайн.

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