gpt4 book ai didi

c++ - 区分 C++ 中的多态类型

转载 作者:行者123 更新时间:2023-11-28 07:40:54 25 4
gpt4 key购买 nike

这是一些代码:

#include <typeinfo>
#include <assert.h>
#include <vector>

class Super {};

class Sub1 : public Super {};

class Sub2 : public Super {};

int main() {
std::vector<Super*> vec;

vec.push_back(new Sub1);
vec.push_back(new Sub2);

assert(typeid(vec[0]) == typeid(vec[1]));
assert(typeid(vec[0]) != typeid(vec[1]));
}

不幸的是,第一个断言通过了,而第二个断言没有通过。我对这个结果并不感到惊讶,但如果能够以这种方式辨别类型就好了。

我的(有点hackish)解决方法:

#include <typeinfo>
#include <assert.h>
#include <vector>

enum SubTypeEnum {
Sub1_T,
Sub2_T
};

class Super {
SubTypeEnum _type;
public:
Super(SubTypeEnum __type) : _type(__type) {}
SubTypeEnum type() { return _type; }
};

class Sub1 : public Super {
public:
Sub1() : Super(Sub1_T) {}
};

class Sub2 : public Super {
public:
Sub2() : Super(Sub2_T) {}
};

int main() {
std::vector<Super*> vec;

vec.push_back(new Sub1);
vec.push_back(new Sub2);

assert(vec[0]->type() != vec[1]->type());
assert(vec[0]->type() == vec[1]->type());
}

这会产生预期的结果,但看起来很乱。有没有更好的方法来找出我正在处理的是哪种类型?

最佳答案

首先,您在使用 typeinfo 时有点错误,当应用于指针时,它返回指针的类型,但当应用于取消引用的指针时,它返回指向的对象的实际类型,只要基类型至少有一个虚函数(通常是析构函数)。所以以下将起作用:

class Super {
public:
virtual ~Super() {}
};

class Sub1 : public Super {};

class Sub2 : public Super {};

int main() {
std::vector<Super*> vec;

vec.push_back(new Sub1);
vec.push_back(new Sub2);

assert(typeid(vec[0]) == typeid(vec[1]));
assert(typeid(*vec[0]) != typeid(*vec[1]));
}

其次,进行这种类型切换通常被认为是您做错事的标志。例如代替

void foo(Base* v) {
//Here SOMETHING and SOMETHING_ELSE are constants we calculate elsewhere.
if( typeid(*v)==SOMETHING ) { cout<<"Got a SOMETHING"<<endl; }
else if (typeid(*v)==SOMETHING_ELSE ) { cout<<"Got a SOMETHING ELSE"<<endl; }
}

或其大致等价物

void foo(Base* v) {
if( dynamic_cast<Something*>(v) ) { cout<<"Got a SOMETHING"<<:endl; }
else if ( dynamic_cast<SomethingElse*>(v) { cout<<"Got a SOMETHING ESLE"<<endl; }

通常将功能添加到基类中:

class Base
{
public:
virtual void printMessage()=0;
};

class Something : public Base
{
void printMessage() { cout<<"Got a SOMETHING"<<endl; }
}

class SomethingElse : public Base
{
void printMessage() { cout<<"Got a SOMETHING ELSE"<<endl; }
}

void foo(Base * v)
{
v->printMessage();
}

关于c++ - 区分 C++ 中的多态类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15870921/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com