好的,所以我遇到了一些非常奇怪的问题,即在类中存储一个基类指针数组,然后设置这个基类指针等于一些动态分配的派生类指针。 我的代码太长了,并且在这里发布了GUI调用,因此我会在这里制作一些模拟代码来演示我正在使用的方法
基类 - 基础
class Base
{
public:
Base(){ // do nothing}
virtual void SetUI(){ // do nothing}
}
派生类 - 派生
class Derived : public Base
{
public:
Derived() : Base() { // do nothing}
virtual void SetUI(){// do nothing}
}
这是一个基本上保存我的程序数据的类,它包含一个指向基类的指针数组。这些指针通过指向动态创建的派生类类型的对象来初始化。
class HelperClass
{
private:
Base * basearray[2];
public:
HelperClass()
{
basearray[0] = new Derived;
basearray[1] = new Derived;
}
Base * getBaseArray(int key)
{
return this->basearray[key];
}
}
这是我的“主要”,这是一切开始变得怪异的地方。
int main()
{
HelperClass hold;
hold.getBaseArray(0)->setUI();
// NOTHING HAPPENS ABOVE, THE CODE DOESN'T EVEN REACH THIS POINT, IT JUST GET'S LOST SOMEWHERE IN //THE ABOVE STATEMENT. i KNOW THIS BECAUSE I PUT AN exit(0) inside the function setUI() for both the //base and derived class and the program doesn't exit.
// this also does nothing
if(hold->getBaseArray(0) || !hold->getBaseArray(0))
exit(0);
return 0;
}
但奇怪的是,如果我执行类似下面的操作,我只是声明一个基类指针并让它指向派生类的动态创建对象,一切正常。
int main()
{
Base *hold;
hold = new Derived;
hold->setUI(); // <- this works polymorphically
return 0;
}
当我尝试使用HelperClass中的基类指针数组时,有没有人知道为什么我的程序停止工作?当我尝试执行getBaseArray(int)时,它不会返回任何内容,这会导致类似
的语句if(hold->getBaseArray(0) || !hold->getBaseArray(0)) {exit(0);}
不让程序退出,这很奇怪,因为getBaseArray()返回的指针是null或非null,这意味着程序应该退出,无论什么
答案 0 :(得分:1)
我(和我的编译器)在第一个main()
SetUI()
,但在main
中,您尝试拨打setUI()
。也许你的项目中有两个功能,这就是你没收到任何东西的原因。hold
声明为对象,而不是指针。有了这个,你不能像hold->someFn()
那样。你应该把它叫做hold.someFn()
。以下是带有更正的代码。它由我运行没有问题。试试吧。
struct Base
{
Base(){}
virtual ~Base() {}
virtual void SetUI() {
cout << "base" << endl;
}
};
struct Derived : public Base
{
Derived() : Base() {}
virtual ~Derived() {}
virtual void SetUI() {
cout << "derived" << endl;
}
};
class HelperClass
{
Base * basearray[2];
public:
HelperClass() {
basearray[0] = new Derived;
basearray[1] = new Derived;
}
~HelperClass() {
delete basearray[0];
delete basearray[1];
}
Base *getBaseArray(int key) {
return basearray[key];
}
};
int main()
{
HelperClass hold;
hold.getBaseArray(0)->SetUI();
if(hold.getBaseArray(0))
cout << "some output" << endl;
return 0;
}