有时候要求一个类的虚函数成员不再被它的继承类重写,类似于java的final的作用,可以使用如下策略:
class Timer
{
public:
virtual void onTick() const;
};
class Widget
{
public:
private:
class WidgetTimer : public Timer
{
public:
virtual void onTick() const;
};
WidgetTimer timer;
};
在Widget类中定义了一个新的WIdgetTimer类,它public继承了Timer类,因此可以重写Timer的虚函数。WidgetTimer的对象是Widget的私有成员变量,因此在它的派生类中是不能访问该私有成员变量的,也就不能重写该虚函数。
如果Widget是private继承的Timer类,则它的public派生类还是可以重写该虚函数的。
#include <iostream>
using namespace std;
class Timer
{
public:
virtual void onTick() const
{
cout<<"Timer::onTick"<<endl;
}
};
class Widget : private Timer
{
public:
void fun()
{
onTick();
}
private:
virtual void onTick() const
{
cout<<"Widget::onTick"<<endl;
}
};
class Derived : public Widget
{
public:
private:
virtual void onTick() const
{
cout<<"Derived::onTick"<<endl;
}
};
int main()
{
Widget *pw;
Widget w;
pw = &w;
pw->fun();
Derived d;
pw = &d;
pw->fun();
return 0;
}
运行结果: