在 C++ 中将派生类对象分配和访问到基类“指向指针”对象

Posted

技术标签:

【中文标题】在 C++ 中将派生类对象分配和访问到基类“指向指针”对象【英文标题】:Assigning and Accesing derived class object to base class "pointer to pointer" object in C++ 【发布时间】:2017-03-24 06:07:00 【问题描述】:

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

我只想使用指向基类指针对象的指针来访问派生类对象。

基类:

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;


【问题讨论】:

【参考方案1】:
*an = new use();

指针an 未初始化,无法取消引用。在这里使用双指针(指向指针的指针)没有实际意义。在这种情况下,tit 所做的只是为代码添加另一个级别的引用。取消引用此类指针的表达式导致指向“另一个”类的指针的值,存储在哪里?你从来没有创建过那个存储,所以这样的操作是一个 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;
;

无法创建此类或未覆盖这些方法的派生类的实例,但它提供了您正在研究的“样板”机制。

【讨论】:

优秀。谢谢老哥【参考方案2】:

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

int main()

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

【讨论】:

谢谢伙计。但是,当我使用上面提供的相同 main() 函数时,我收到一个错误,比如使用了未初始化的变量“an”。你能告诉我如何初始化它吗?

以上是关于在 C++ 中将派生类对象分配和访问到基类“指向指针”对象的主要内容,如果未能解决你的问题,请参考以下文章

在 C++ 中将指向基类的指针传递给派生类的成员函数

关于C++基类、派生类的引用和指针

C++ 类 访问限制

C++中的派生类,可以不定义对象直接调用基类的成员和调用自己的成员函数嘛???

在 C++ 中将派生类类型的向量链接到父类类型的向量

关于C++基类与派生类