C ++: доступ к переменным, присутствующим только в одном из производных классов - PullRequest
1 голос
/ 16 мая 2011
void func1()
{
}

class Base
{
    public:
        virtual void memfunc() = 0;
};
class DerivedA: public Base
{
    public:
        virtual void memfunc() = 0;
};
class Derived1: public DerivedA
{
    public:
        void memfunc()
        {  
            func1();
        }
};
class Derived2: public DerivedA
{
    public:
        int* pbuf;
        int val;

        void func2(int* pbuf,int val)
        {
                /* update pbuf depending on the value of val*/
        }

        void memfunc()
        {  
            func1();
            func2(pbuf,val);
        }
};
class user{
    public:
    Base* mBase;
    void userfunc()
    {
        mBase = f(); //Object pointer to Derived1/Derived2 will be assigned based on dynamic loading;
//Before calling the below func, I Need to assign value to the 'val' variable of the class 'Derived2'
        mBase->memfunc();
    }

};
int main()
{
    user ouser;
    ouser.userfunc();
    return 0;
}

Переменные val и pbuf присутствуют только в Derived2.Как я могу присвоить им значения в userfunc/main, поскольку я не знаю, будет ли объект mBase указывать на Derived1/Derived2.

Ответы [ 5 ]

3 голосов
/ 16 мая 2011

Вы можете использовать dynamic_cast и проверить NULL, который будет возвращен, если объект не имеет тип Derived2. Если приведение успешно, вы можете использовать все методы Derived2.

2 голосов
/ 16 мая 2011

Используйте dynamic_cast в userfunc() и проверьте на Derived2, т.е.

Derived2* p = dynamic_cast<Derived2*>(mBase);
if (p) // this is NULL if the above fails.
{
  // initialize...
}
0 голосов
/ 16 мая 2011

Используйте typeid:

http://en.wikipedia.org/wiki/Typeid

0 голосов
/ 16 мая 2011

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

Если вам нужно сделать это, возможно, вы можете добавить метод getProperty () / setProperty () в ваш базовый класс.Что-то вроде:

class Base
{
    public:
        virtual void memfunc() = 0;
        virtual void setProperty(String name, Property prop);
        virtual Property getProperty(String name);
};
0 голосов
/ 16 мая 2011

Если val и pbuf присутствуют только в Derived2, у вас должен быть какой-то способ их идентифицировать.Вам нужно будет создать enum Base :: Type {Derived1, Derived2}, установить их в ваших производных классах и протестировать в main.Затем вы можете привести mBase к Derived2, если он относится к этому типу, и установить val.

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