gpt4 book ai didi

c++ - 运行时类型信息(为什么这段代码不起作用)

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

我有一个与此类似的代码(经过简化以帮助解决问题)

  class a
{
protected:
int m_x;
public:
a(int x):m_x(x){};
~a(){};
virtual int GetX()=0;
}

class b:public a
{
public:
b(int x):a:(x){};
~b(){};
virtual int GetX(){return m_x+2;};
}
class c:public a
{
public:
c(int x):a:(x){};
~c(){};
virtual int GetX(){return m_x+4;};
}

我还有这些功能:

vector<a> GetData()
{
vector<a> data;
data.push_back(b(1));
data.push_back(c(1));
}

void printData()
{
vector<a> data=GetData();
for(int I=0;i<data.size();I++)
{
cout<< data[I].GetX()<<endl;
}
}

上面的程序并没有编译出带有虚函数的类不能被实例化的错误。

所以我把 a 改成了这个:

class a
{
protected:
int m_x;
public:
a(int x):m_x(x){};
~a(){};
virtual int GetX()={return m_x};
}

但是我并没有像我想的那样得到正确的结果,因为我创建了 b 和 c 类型的对象,然后当我调用 GetX 时,应该调用它们的函数而不是 a。所以我得到了这些数据:

1
1

代替

 3
5

我该如何解决这个问题?

我应该打开编译器中的任何开关来让它工作吗?

我使用的是 visual studio 2012。

最佳答案

您需要使用指针 vector 。幸运的是,由于您使用的是 VS2012,因此您拥有现代智能指针(以及其他一些 C++11 优点):

typedef std::vector<std::unique_ptr<a>> DataVector;

DataVector GetData() {
DataVector data;
data.push_back(std::unique_ptr<b>(new b(1)));
data.push_back(std::unique_ptr<c>(new c(1)));
return data;
}

void PrintData() {
for(const auto & datum : GetData())
std::cout << datum->GetX() << std::endl;
}

关于c++ - 运行时类型信息(为什么这段代码不起作用),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19638025/

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