我正在努力学习面向对象编程的核心特性,这可能是一个奇怪的问题,但我想问。
为什么要用继承和多态来代替函数模板实例 来调用相同签名的成员函数?
模板是一种在编译时工作的功能(静态),所有涉及到的对象的类型都可以通过阅读代码,看到每一种对象是什么来计算出来。
而继承和多态则是为我们在编译时无法知道对象的类型而设计的。
举个例子,看看这段代码。
Base* ptr = randomCoinTossIsHeads()? new Derived1() : new Derived2();
ptr->virtualFunction();
这里,我们无法静态地知道(在编译时) ptr指向的是什么类型的对象。它有 50% 的机会是 Derived1,50% 的机会是 Derived2。这意味着我们不能在这里使用模板来决定调用哪个函数。模板假设我们在生成代码时就知道我们要处理的是什么类型的东西,而这里的情况并非如此。
希望能帮到大家!