将派生类对象分配和访问到基类"指针指向" C ++中的对象

时间:2017-03-24 06:07:01

标签: c++ pointers inheritance virtual-functions

我对c ++非常陌生。我有一个情况:我有一个基类,它拥有两个虚函数(不纯)。我有一个这个类的派生类,我实现了这些虚函数。现在在我的main()函数中,我创建了一个指向基类的指针对象的指针。现在使用此对象如何访问派生类对象和函数。

我只希望指针指向基类的指针对象应该用来访问派生类对象。

BASE CLASS:

class another
{
    public:
    virtual void setName(){};
    virtual string getName(){};
};

派生类

class use: public another
{
    public:
        string str;
    void setName()
        {
            str = "USE CLASS";
        }
        string getName()
        {
            return str;
        }
};

我的main()函数:

int main()
{
    another **an;
    *an = new use();
    an->setName();  //getting error
    cout<<an->getName()<<endl; //getting error
    return 0;

}

2 个答案:

答案 0 :(得分:2)

*an = new use();

指针an未初始化,无法解除引用。使用doubled指针(指针指针)在这里没有实际意义。所有针锋相对的都是在这种情况下为代码添加另一级别的引用。取消引用这种指针的表达式会导致指向“另一个”的指针值,存储在哪里?您从未创建过该存储,因此此类操作是UB。

代码的法律变体:

int main()
{
    another **an = new another*(); // creating storage for pointer
    *an = new use();
    (*an)->setName();  
    cout<<(*an)->getName()<<endl; 
    delete *an;  // don't rely on OS to do so.
    delete an;
    return 0;
}


int main()
{
    another **an = new another*(new use()); // doing this in one line
    // storage of *an would be value-initialized by value returned
    // from 'new use()' instead of default initialization
    (*an)->setName();  
    cout<<(*an)->getName()<<endl; 
    delete *an;  // don't rely on OS to do so.
    delete an;
    return 0;
}

int main()
{
    another *an = new use(); 
    // We don't need another pointer~ use an reference where required?

    an->setName();  
    cout<<an->getName()<<endl; 
    delete an;  // don't rely on OS to do so.
    return 0;
}

PS。这个类another的声明在技术上是不正确的,我可以假设你跳过了getName的主体。它应该导致关于函数缺少返回值的编译时错误。如果another本身不可用,则可以将方法声明为纯

class another
{
    public:
    virtual void setName() = 0;
    virtual string getName() = 0;
};

不能创建不覆盖这些方法的类或派生类的实例,但它提供了&#34;样板&#34;你正在学习的机械师。

答案 1 :(得分:0)

an是指向another指针的指针。 *an返回指向another的指针。所以你想(*an)->setName();这样:

int main()
{
    another **an;
    *an = new use();
    (*an)->setName();  //getting error
    cout<<(*an)->getName()<<endl; //getting error
    return 0;
}