我有一个父类,有两个或更多的子类继承它。未来可能会增加不同的子类数量,以满足更多的需求,但它们都将遵循基类方案,并包含一些自己独特的方法。让我举个例子 -
#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()
方法。所以我脑海中有两个选择 -要么在子类中将
CFunc()
和friends包装在某个已定义的虚拟方法中,以便它们一起执行。但是随着独特方法数量的增加,我将失去对特定执行的控制。或者在基类中提供一些纯虚方法,就像
void process() = 0
,并让它们按照他们的意愿在子类中定义。可能会被一些人留空void process(){}
并被一些人使用。但是,与前一个选项类似,我失去了返回值和参数。并且像之前的选项一样,如果某个子类中有更多的方法,则这不是解决问题的正确方式。还有另一个选择 -
dynamic_cast<>
?在这里这是一个好的选择吗 - 将父指针转换回子指针(顺便说一下,我在这里使用智能指针,所以只允许unique/shared
)然后调用所需的函数。但是我如何区分不同的子类?另一个公共成员,可以返回一些独特的类枚举值吗?我对这种情况非常不熟悉,希望得到反馈。我应该如何解决这个问题?
CFunc
和DFunc
解决什么问题?在C++中,“我想要做这个,但它的效果不好”通常表明这个并不是你实际问题的正确解决方案。 - kfsoneon()
、off()
、read()
、write()
和大量相似的方法,但是温度传感器有一个不同的方法-int getTemp()
,蜂鸣器也是如此-void make_sound()
。我可以将它们的原型始终放在基类中作为纯虚拟的,但这样做不会... - Abhinav Gauniyal