【发布时间】:2016-05-05 11:22:56
【问题描述】:
我有一个与使用数组参数设计派生类有关的问题。我有从 A 派生的 B 类。从 AA 派生的 BB 类分别具有 B 和 A 数组...
#include <iostream>
class A
{
public:
A(){}
virtual void foo(){std::cout<<"foo A\n";}
int idx[3];
};
class B: public A
{
public:
B():A(){}
void foo(){std::cout<<"foo B\n";}
int uidx[3];
};
class AA
{
public:
AA(){}
AA(int count){
m_count = count;
m_a = new A[count];
}
virtual A* getA(){return m_a;}
~AA(){ delete[] m_a;}
protected:
A* m_a;
int m_count;
};
class BB: public AA
{
public:
BB(int count):AA()
{
m_count = count;
m_a = new B[count];
}
B* getA(){return dynamic_cast<B*>(m_a);}
};
int main()
{
AA* aa = new AA(2);
BB* bb = new BB(2);
B* b = bb->getA();
B& b0 = *b;
b0.idx[0] = 0;
b0.idx[1] = 1;
b0.idx[2] = 2;
B& b1 = *(b+1);
b1.idx[0] = 2;
b1.idx[1] = 3;
b1.idx[2] = 4;
std::cout<<bb->getA()[1].idx[0]<<"\n"; //prints 2
std::cout<<bb->getA()[1].idx[1]<<"\n"; //prints 3
std::cout<<bb->getA()[1].idx[2]<<"\n"; //prints 4
AA* cc = static_cast<AA*>(bb);
cc->getA()[0].foo(); //prints foo B
std::cout<<cc->getA()[1].idx[0]<<"\n"; //prints 4198624 ??
std::cout<<cc->getA()[1].idx[1]<<"\n"; //prints 0 ??
std::cout<<cc->getA()[1].idx[2]<<"\n"; //prints 2 ??
cc->getA()[1].foo(); //segmentation fault
delete aa;
delete bb;
return 0;
}
在将 BB 静态转换为 AA 后,我无法访问索引大于 0 的 A。 如何解决这个问题? 谢谢。
【问题讨论】:
-
我建议你阅读关于Is an array of Derived a kind-of array of Base的C++ FAQ部分。
-
这可以称为array decay bug。
标签: c++ class pointers segmentation-fault derived