C++模板duck-typing与纯虚基类继承

Gio*_*hal 12 c++ inheritance templates base-class pure-virtual

在模板duck-typing和纯虚基类继承之间进行选择的指导原则是什么?例子:

// templates
class duck {
    void sing() { std::cout << "quack\n"; }
};

template<typename bird>
void somefunc(const bird& b) {
    b.sing();
}

// pure virtual base class
class bird {
    virtual void sing() = 0;
};

class duck : public bird {
    void sing() { std::cout << "quack\n"; }
}

void somefunc(const bird& b) {
    b.sing();
}
Run Code Online (Sandbox Code Playgroud)

Sch*_*ron 11

使用模板duck-typing,您正在进行静态多态.因此,你无法做到这样的事情

std::vector<bird*> birds;
birds.push_back(new duck());
Run Code Online (Sandbox Code Playgroud)

但是,由于您依赖编译时键入,因此效率更高(没有虚拟调用意味着没有动态调度(基于动态类型)).

  • @Scharron.虚拟调用不会导致"动态类型检查"或任何类型.C++从不在运行时执行类型检查. (3认同)
  • 您的`birds`需要切片,而是使用指针. (2认同)