У меня есть следующий пример кода. Один базовый класс и два производных класса, каждый со своими функциями (соответственно, function1 и function2). Ни function1, ни function2 не являются виртуальными в базовом классе. Я не могу изменить это, так как эти классы уже реализованы.
#include <iostream>
class Base
{
public:
Base(){}
Base(int val) : m_base(val){}
virtual ~Base(){}
//base class methods
private:
int m_base;
};
class Derived1 : public Base
{
public:
Derived1(int val) : m_derived1(val){}
~Derived1(){}
void print1(){std::cout << "Using Derived 1 class method" << std::endl;};
private:
int m_derived1;
};
class Derived2 : public Base
{
public:
Derived2(int val) : m_derived2(val){}
~Derived2(){}
void print2(){std::cout << "Using Derived 2 class method" << std::endl;};
private:
int m_derived2;
};
Я сейчас пытаюсь добиться следующего. Я хочу решить во время выполнения, какой производный класс я хочу использовать.
Более того, я хотел бы вызвать их из метода базового класса, используя только объект b. В противном случае мне пришлось бы переписывать свою программу для каждой опции, которую я позволяю ввести во время выполнения (на практике у меня есть довольно много классов, из которых я могу выбирать).
int main()
{
int option;
std::cin >> option;
Base* b = new Base(5);
Derived1* d1 = new Derived1(5);
Derived2* d2 = new Derived2(5);
d1->print1(); //obviously this works
d2->print2(); //obviously this works
//In reality I thus have a function in d1 and d2 which is not present in b
//I have to decide on runtime which class I need to use
if(option == 1)
{
b = d1;
}
else if(option == 2)
{
b = d2;
}
/*
Rest of program ...
b->invokeMethod;
// ... //
b->invokeMoreMethods;
*/
//Call derived functions on base object
//b->print1(); //fails obviously
if(option == 1)
{
dynamic_cast<Derived1*>(b)->print1(); //will work if option == 1 is specified (*)
}
if(option == 2)
{
dynamic_cast<Derived2*>(b)->print2(); //will work if option == 2 is specified (*)
}
return 0;
}
Можно ли сделать строки кода (*) без цикла if (option == 1) и if (option == 2)? Я не могу использовать какую-либо виртуальную функциональность, поскольку она не реализована ... Есть ли более элегантные решения этой проблемы?