我以为我知道指针,但当我研究运行时多态性/动态绑定时,我看到了指针的一种非常不同的用法。下面是我的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;
}
这里的表达式不是Derived()
(这确实会构造一个临时对象),而是new Derived()
,这是new
的特定语法,用于分配和构造具有动态生存期的对象,并返回指向该对象的指针。请注意,用于结束对象生存期的相应delete
缺失,但请参阅下一点。
没有。特别是,对象的生存期不会影响指针的使用,多态性也不需要指针(引用也一样)。在任何情况下,动态分配都应该使用智能指针来完成,而不是裸的new
s。
这仍然是正确的:obj
指向的是derived
对象的base
子对象。C++提供了从派生*
到基*
(以及派生&
到基&
)的隐式指针调整转换,以方便多态性的使用。