C++ casting and typeid
C++ casting and typeid
我得到了一个函数,它有两个基类指针,根据子类的不同,应该调用其他函数。。。
像这样:
void function(A* a, A* a2){
if (typeid(*a).name() == "B"){
if(typeid(*a2).name() == "C"){
otherFunction();
}
if(typeid(*a2).name() == "D"){
otherFunction2();
}
}
}
然而,还有一个完整的问题:
1) 我读过typeid.name根据编译器的不同会产生不同的结果,因此我不想使用它。
2) 我考虑过创建一个"B"的实例,而不是编写if(typeid(*a2) == typeid(instanceOfB))
,但这将是一项艰巨的工作,因为有很多构造函数参数。。。
3) 我也考虑过使用dynamic_cast,但有些子类看起来像这样:
A <-- B <-- C
因此,如果我想检查参数是否是动态转换的B,即使参数实际上是C,它也会通过,因为C继承自B
编辑:我似乎必须重新考虑这个设计,但由于许多人都说这个设计有缺陷,我会很快解释我的思路:
有一扇窗户。几个不同的物体位于窗户内并四处移动,就像一场游戏。该功能应起到碰撞检测的作用。像这样:浏览屏幕上的所有对象,检查是否发生碰撞。将两个碰撞的对象作为参数,并调用此函数。这个函数查找buncha不同的碰撞,比如"如果a是"箭头",a2是"土匪",那么做一些事情,但如果a2是"树",那么就做这个!
在A
中有一些默认情况下什么都不做并且被它的一些继承类覆盖的虚拟方法不是更好吗?
class A {
public:
virtual void method(A *a2) {
}
virtual void otherMethod() {
}
};
class B : public A {
public:
virtual void method(A *a2) {
a2->otherMethod();
}
};
class C : public B {
public:
virtual void otherMethod() {
// do your C stuff here
}
};
class D : public A {
public:
virtual void otherMethod() {
// do your D stuff here
}
};
这会实现你想要做的事情吗?
相关文章:
- C++核心准则 C35 对于接口类"A base class destructor should be either public and virtual, or protected and nonv
- 为什么C++逐位AND运算符在不同大小的操作数中表现为这样
- 为什么 Clang 不允许"and"作为函数名称?
- 位阵列上的快速AND运算
- C++typeid模板值转换为联合不可接受的转换
- 使用typeid警告未使用的变量
- 是否可以在 C++03 中定义'move-and-swap idiom'等效项
- BoostPython and CMake
- OpenSSL BIO and SSL_read
- Gurobi GRBModel and GRBmodel in C++
- 如何在 lambda 中访问捕获的此指针的"typeid"?
- std::visit and std::variant usage
- SHBrowseForFolder with BIF_BROWSEFORCOMPUTER and SHGetPathFr
- Directx12 and keystrokes
- different between int **arr =new int [ n]; and int a[i][j]?
- C++ getenv and setenv
- Visual Studio 2017 C++,不能使用 typeid() 获取信息对象,缺少指针?;
- Inference pytorch C++ with alexnet and cv::imread image
- Visual Studio 2019 C++ and std::filesystem
- C++ casting and typeid