涉及指针成员变量和多态的非常奇怪的问题

时间:2013-11-25 18:30:33

标签: c++ arrays pointers polymorphism

好的,所以我遇到了一些非常奇怪的问题,即在类中存储一个基类指针数组,然后设置这个基类指针等于一些动态分配的派生类指针。 我的代码太长了,并且在这里发布了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,这意味着程序应该退出,无论什么

1 个答案:

答案 0 :(得分:1)

我(和我的编译器)在第一个main()

中发现了两个错误包
  1. 您在Base和Derived类中声明了SetUI(),但在main中,您尝试拨打setUI()。也许你的项目中有两个功能,这就是你没收到任何东西的原因。
  2. 您将hold声明为对象,而不是指针。有了这个,你不能像hold->someFn()那样。你应该把它叫做hold.someFn()
  3. 以下是带有更正的代码。它由我运行没有问题。试试吧。

    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;
    }