【发布时间】:2020-12-20 15:29:25
【问题描述】:
从它的基类中访问派生的虚函数有什么好的做法吗? 到目前为止,这是我得到的:
class A {
public:
enum class AType{A,B,C,D};
AType aType = AType::A;
virtual void Do(){}
};
class B : public A {
public:
int val = 0;
B(int i) {
aType = AType::B;
val = i;
}
void Do(){
std::cout << val << std::endl;
}
};
int main(){
std::map<std::string, A> bunch;
bunch["01"] = B(10);
bunch["02"] = B(15);
bunch["03"] = B(80);
for (auto& [k, b] : bunch){
switch (b.aType){
case A::AType::A:
break;
case A::AType::B:
static_cast<B&>(b).Do();
break;
}
}
}
我对在那里使用开关不太满意,任何建议都将不胜感激!
【问题讨论】:
-
As 的地图无法容纳Bs,请阅读对象切片。一旦你解决了这个问题,你为什么需要开关?你不能直接打电话给b.Do()吗? -
为什么不直接调用虚拟方法 Do() 而不管类型如何?还是我错过了什么?
-
好吧,映射是A类型的,当我对A中的B调用do时,它调用的是A的虚函数而不是B的派生函数。我不知道切片,我正在阅读,希望我做对了
标签: c++ inheritance virtual