提问者:小点点

我以为指针只能指向同一个类/数据类型?


我以为我知道指针,但当我研究运行时多态性/动态绑定时,我看到了指针的一种非常不同的用法。下面是我的3个问题,它们都是关于下面的单行代码的:

#include <iostream>
class Base {
    public:
    virtual void fun (int x) { std::cout << "base" << std::endl; }
};

class Derived : public Base {
    public:
    void fun (int x) { std::cout << "base" << std::endl; }
};

int main() {

    //--------------------------------------
    //1. Pointer can only hold memory address, 'Derived()' is calling the default constructor it is not a memory address
    //2. What's the point of putting this into heap?
    //3. I thought pointers could only hold memory address of the same datatype/class
    Base* obj = new Derived();
    //--------------------------------------

    obj->fun(5);
    return 0;
}    

共1个答案

匿名用户

  1. 指针只能保存内存地址,'derived()'正在调用默认构造函数它不是内存地址

这里的表达式不是Derived()(这确实会构造一个临时对象),而是new Derived(),这是new的特定语法,用于分配和构造具有动态生存期的对象,并返回指向该对象的指针。请注意,用于结束对象生存期的相应delete缺失,但请参阅下一点。

没有。特别是,对象的生存期不会影响指针的使用,多态性也不需要指针(引用也一样)。在任何情况下,动态分配都应该使用智能指针来完成,而不是裸的news。

这仍然是正确的:obj指向的是derived对象的base子对象。C++提供了从派生*基*(以及派生&基&)的隐式指针调整转换,以方便多态性的使用。