У меня есть родительский класс с именем SavableFile
, 2 класса SaveA
и SaveB
, унаследованные от SavableFile
.
Они определены так:
class SavableFile {
SavableFile(std::string _filename) : p_filename(_filename){}
virtual void write() = 0;
protected:
std::string p_filename;
}
class SaveA : public SavableFile {
SaveA(std::string _filename) : SavableFile(_filename) {}
void write() {
std::cout << "A" << std::endl;
}
}
class SaveB : public SavableFile {
SaveB(std::string _filename) : SavableFile(_filename) {}
void write() {
std::cout << "B" << std::endl;
}
}
Мой вопрос: возможно ли создать SavableFile и, используя расширение имени файла, преобразовать этот savableFile в saveA или saveB? Что-то вроде
SavableFile(std::string _filename) : p_filename(_filename){
std::string ext = GetExtension(_filename);
//this is purely fictionnal, it's only in order to give an idea, i'm not sure if there is a way to do that, that's why i'm asking
if (ext.lower() == "a"){
*this = dynamic_cast<SaveA>(*this);
}
else {
*this = dynamic_cast<SaveB>(*this);
}
}
Чтобы я мог сделать что-то вроде этого:
int main(int argc, char* argv[]){
SavableFile svA("foo.a");
//Here, SavableFile has been changed into SaveA class because of the constructor of SavableFile
svA->write();
//Here should be writed "A"
SavableFile svB("bar.b");
svB->write();
//Here should be writed "B"
}
Я всегда мог сделать тест в основном, чтобы проверить, нужно ли мне создавать класс SaveA или SaveB, но я думаю, что это был бы менее удачный подход к проблеме. Но я не могу найти способ сделать это, и я не нахожу хорошую формулировку, чтобы где-то найти помощь ...
Является ли это возможным?
Большое спасибо!