《Effective C++》条款35

2023-12-18 21:46:43

考虑virtual函数以外的其他选择

1.Non-Virtual Interface

class A
{
public:
	void test()
	{
        // 做一些事前工作
		dotest();
        // 做一些事后工作
	}
private:
	virtual void dotest()
	{
		cout << "A";
	}
};
class B :public A
{
public:
	void test()
	{
		dotest();
	}
private:
	virtual void dotest()
	{
		cout << "B";
	}
};

这个public non-virtual成员函数称为virtual函数的外覆器

这种手法称为NVI手法,在调用Virtual函数前做一些事前工作,包括锁定互斥器,制造运转日志记录项,验证class约束条件,验证函数先决条件等。事后工作包括互斥器的解除锁定,验证函数的事后条件,再次验证class的约束条件等。

2.Function Pointers

class A;
int defaultf(const A& a);
class A
{
public:
	typedef int (*funcptr)(const A& a);
	explicit A(funcptr hcf = defaultf)
		:func(hcf){}
	int value() const
	{
		return func(*this);
	}
private:
	funcptr func;
};

这样创建不同的对象就可以传入不同的函数,而且函数可以在运行期变更。假如A提供一个函数,用来替换当前的函数。

3.function?

class A;
int defaultf(const A& a);
class A
{
public:
	typedef function<int(const A& a)> Func;
	explicit A(Func hcf = defaultf)
		:func(hcf){}
	int value() const
	{
		return func(*this);
	}
private:
	Func func;
};

相当于一个泛型指向函数的指针。有需要时也进行bind

古典?

class A;
class Func
{
public:
	virtual int cal(const A& a) const;
};
Func defaultCal;
class A
{
public:
	explicit A(Func* hcf = &defaultCal)
		:func(hcf){}
	int value() const
	{
		return func->cal(*this);
	}
private:
	Func* func;
};

Func类作为基类,多个函数可以继承Func类,构造A类对象时可以传入不同的函数类,A类便可以进行多态调用不同的函数。

总结:?

Strategy模式将算法独立于程序流程之外,降低了算法与程序主流程之间的耦合度。

文章来源:https://blog.csdn.net/qq_64863535/article/details/135064640
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。