class Base{
public:
void Foo(){
DoFoo(); //在这里调用的是相应子类的实现版本
}
private:
virtual void DoFoo(){ //这个virtual是私有的
cout << "Base's DoFoo1" <<endl;
}
};
class Derived: public Base{
private:
virtual void DoFoo(){ //实现父类的virtual函数
cout << "Derived's DoFoo1" << endl;
};
};
NVI的实现思想:
让基类中的函数成为public成员函数,但让它成为non-virtual,并调用一个private virtual函数,如果子类中需要重新定义则只要覆盖函数并让它成为子类的的private virtual,这时父类中真正调用的就会是子类中的private virtual函数。
优点:
如果需要对某个虚函数添加一些条件,原来的虚函数继承方式会导致每个子类都需要重新写一遍,而现在只需要在基类中的那个non-virtual函数添加相应的规则即可