我读到通过“继承”使用泛型代码的一个优点是“在运行时确定对象类型的事实”,因为这样可以提供更大的灵活性。
我不明白这一点。它如何真正实现更大的灵活性?
例如,如果我从派生Base
的类型获取对象,那么:
class Base{
public:
virtual void method() const { /* ... */ }
};
class D1 : public Base{
public:
void method() const override { /* ... */ }
};
class D2 : public Base{
public:
void method() const override { /* ... */ }
};
我发送函数f
(例如)以下对象:
Base* b = new D1;
f(b);
灵活性在哪里(它被定义为在运行时完成的优势)?
你的例子没有证明它,但它可以。
f(b)
可能是
void f(Base* b) {
b->method();
}
现在,执行的实际method()
代码在运行时由传入的对象的类型确定。
它如何真正实现更大的灵活性?
它更灵活,因为f(..)
的作者不需要知道Base:method()
在任何特定情况下如何工作:你可以添加D3,D4,D5类与method()
的新实现,而f(..)
不需要知道或改变。