Недавно я хотел получить C++ для динамического решения члена/функции по его входному параметру, который входит в некоторые производные версии. Вот что я имею в виду:C++ Динамическое связывание в аргументе метода
#include <iostream>
class Base {
};
class DerivedA : public Base {
};
class DerivedB : public Base {
};
class DerivedC : public Base {
};
class Test {
public:
void world(DerivedA *instance)
{
std::cout << "DerivedA" << std::endl;
}
void world(DerivedB *instance)
{
std::cout << "DerivedB" << std::endl;
}
void world(Base *instance)
{
std::cout << "Base" << std::endl;
}
};
int main()
{
Base *a = new Base;
Base *b = new DerivedA;
Base *c = new DerivedB;
Base *d = new DerivedC;
Test hello;
hello.world(a);
hello.world(b);
hello.world(c);
hello.world(d);
return 0;
}
Поведение Я ХОТЕЛ это:
Base
DerivedA
DerivedB
Base
Но наверняка на выходе я действительно получаю это:
Base
Base
Base
Base
Я понимаю, что динамическое связывание является другим способом, разрешая правильную функцию-член в производных классах базы, а не как этот путь, но может ли он работать для этого?
Может быть, я только отсутствует важный момент ..
Однако многие заранее спасибо!
Sebastian
Какой здесь вариант использования? Я не понимаю, почему вы не можете просто определить каждую переменную как соответствующий производный тип вместо 'Base'. Единственный способ получить нужную функциональность - использовать 'dynamic_cast <>'. –
Вы передаете 'Base *' всем этим функциям. Вам нужно использовать [виртуальные функции] (http://www.learncpp.com/cpp-tutorial/122-virtual-functions/) для того, что вы хотите достичь (вам нужно было бы сделать функцию 'world' членом- функция). – jliv902
@RedAlert: вам также потребуется иметь хотя бы одну виртуальную функцию-член и выполнить 'if (dynamic_cast (экземпляр) {...}' - оба из них, вероятно, более трудоемкие, чем вызов виртуальной функции в первое место. –