вызов функции дочернего класса - PullRequest
0 голосов
/ 10 января 2019

Как я могу вызвать дочернюю функцию из указателя типа parent, который указывает на дочерний элемент?

class a{
public:
    virtual void print(){cout << "From a" << endl;}
};

class b: public a{
public:
    void print(){cout << "Form b" << endl;}
    void printFunction(){cout << "Exist in b" << endl;}
};

int main() {

    a* Obj = new b;

    Obj->print();
    Obj->printFunction();
    return 0;
}

Здесь у меня есть указатель типа "a", который указывает на "b". Я хочу вызвать «printFunction», которая определена только в классе b.

Я получил эту ошибку:

У класса a нет члена с именем printFunction

Вопрос в том, как я могу вызвать "printFunction", используя этот указатель? или как применить здесь кастинг?

Ответы [ 2 ]

0 голосов
/ 10 января 2019

Вы можете уменьшить рейтинг, используя dynamic_cast преобразование

class base {
  public:
    void print() {std::cout << "base class print";}
};

class derived : public base {
  public: 
    void printFunction() {std::cout << "derived class print";}
};

int main() {

  base* ptr_derrived  = new derived();

  if(Derived* d = dynamic_cast<derived*>(ptr_derived) {
    std::cout << "downcast successful\n";
    d->printFunction(); // safe to call
  }

  delete ptr_derrived;

}
0 голосов
/ 10 января 2019

Использование dynamic_cast:

class a{
public:
    virtual ~a(){}
    virtual void print(){ cout << "From a" << endl; }
};

class b: public a{
public:
    void print(){ cout << "Form b" << endl; }
    void printFunction(){ cout << "Exist in b" << endl; }
};

int main() {

    a* Obj = new b;

    Obj->print();

    b* bObj = dynamic_cast<b*>(a);
    if (bObj)
        bObj->printFunction();

    delete a;

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