“在C++语言中,当我们使用基类的引用或指针调用一个虚成员函数时,会执行动态绑定。”–c++ primer15.3
根据上面这句话,c++并没有规定多态必须使用动态内存。即指向栈和堆内存的指针和引用都可以进行多态 ,利用指向栈上(stack)空间的指针进行多态:
class Base
{
public:
virtual void Display()= 0;
};
class Derived:public Base
{
public:
void Display()
{
cout << "In derived" << endl;
}
};
int main()
{
Base* base;
Derived derived1;
base = &derived1;
base->Foo();
return 0;
}
但是有时候往往被迫使用指向堆空间(heap)的指针进行多态:
典型的例子是工厂模式:
void doSomething(int what) {
// figure out which implementation to create
Base * b;
if(doA) {
b = new ConcreteA; // 1a
} else if(doB) {
b = new ConcreteB; // 1b
}
...
b->...; // 2
}
你不能使用栈。1a和1b离开作用域时,你从栈中得到的每一个存储都会被回收。你必须使用堆,因为你需要一些能维持局部范围的存储。
这也就是C++primer第12.1.1节p403页使用动态内存的第二个原因–“程序不知道所需对象的准确类型”。
翻译源