У меня есть родительский класс с 2 или более дочерними классами, полученными из него. Количество различных дочерних классов может увеличиваться в будущем, поскольку предъявляются больше требований, но все они будут придерживаться схемы базового класса и будут содержать несколько уникальных методов. Позвольте мне привести пример -
#include <iostream>
#include <string>
#include <vector>
#include <memory>
class B{
private: int a; int b;
public: B(const int _a, const int _b) : a(_a), b(_b){}
virtual void tell(){ std::cout << "BASE" << std::endl; }
};
class C : public B{
std::string s;
public: C(int _a, int _b, std::string _s) : B(_a, _b), s(_s){}
void tell() override { std::cout << "CHILD C" << std::endl; }
void CFunc() {std::cout << "Can be called only from C" << std::endl;}
};
class D : public B{
double d;
public: D(int _a, int _b, double _d) : B(_a, _b), d(_d){}
void tell() override { std::cout << "CHILD D" << std::endl; }
void DFunc() {std::cout << "Can be called only from D" << std::endl;}
};
int main() {
std::vector<std::unique_ptr<B>> v;
v.push_back(std::make_unique<C>(1,2, "boom"));
v.push_back(std::make_unique<D>(1,2, 44.3));
for(auto &el: v){
el->tell();
}
return 0;
}
В приведенном выше примере метод tell()
будет работать правильно, поскольку он является виртуальным и правильно переопределяется в дочерних классах. Однако на данный момент я не могу вызвать метод CFunc()
и метод DFunc()
их соответствующих классов. Поэтому у меня есть два варианта -
-
либо packup
CFunc()
, либо друзей внутри некоторого уже определенного виртуального метода в дочернем классе, чтобы он выполнялся вместе. Но я потеряю контроль над конкретным выполнением уникальных методов по мере увеличения их числа. -
или предоставить некоторые чистые виртуальные методы в базовом классе, которые будут похожи на
void process() = 0
и пусть они будут определены в дочерних классах по своему усмотрению. Вероятно, остался пустымvoid process(){}
некоторыми и использован некоторыми. Но опять же это не кажется правильным, поскольку я потерял возвращаемую стоимость и аргументы на этом пути. Также, как и предыдущий вариант, если в каком-либо дочернем классе есть больше методов, это не будет правильным решением.
а другой -
-
dynamic_cast<>
?. Будет ли это приятным вариантом здесь - отбрасывание родительского указателя на дочерний указатель (btw Я использую интеллектуальные указатели здесь, поэтому разрешено толькоunique/shared
), а затем вызывается требуемая функция. Но как бы я дифференцировал b/w разные дочерние классы? Другой публичный член, который может вернуть некоторое уникальное значение перечисления класса?
Я совершенно не ознакомлен с этим сценарием и хотел бы получить некоторые отзывы. Как мне подойти к этой проблеме?