Доступ к функциям класса, которые реализуют интерфейс, который не является частью интерфейса - PullRequest
1 голос
/ 05 августа 2011

Я пишу приложение на С ++. У меня есть интерфейс, определенный с различными функциями:

class ITest
{
public:
        virtual void x()=0;
        virtual void y()=0;
}

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

class NewClass: public ITest
{
public:
    virtual void x();
    virtual void y();
    // new function not defined in interface
    virtual void z();
}

Теперь я хочу получить доступ ко всем этим трем функциям из моих модульных тестов. В настоящее время я использую:

ITest* pTest;

, который даст мне доступ только к двум функциям, определенным в интерфейсе. Как я могу также получить доступ к функции z (), не определяя ее в интерфейсе?

Ответы [ 3 ]

3 голосов
/ 05 августа 2011
NewClass* p = dynamic_cast<NewClass*>(pTest);
if(p==0)
{
   //error!!! pTest's dynamic type wasn't NewClass*
}
else
{
   p->z();
}

Вместо dynamic_cast вы можете использовать static_cast. Но если динамический тип pTest на самом деле не NewClass*, вы получите неопределенное поведение.

0 голосов
/ 05 августа 2011

Поскольку это модульный тест, вы управляете строкой, в которой создается класс.

Теперь не делайте:

ITest* pTest = new NewClass();

но сделать:

NewClass* pTest = new NewClass();

и вы можете использовать pTest->z() без проблем.

0 голосов
/ 05 августа 2011

Используйте NewClass * или приведите к одному, если он один.

...