C++ 类Pimpl手法

在大佬的代码中看到经常使用这种结构,于是研究了一下,最开始没太看懂用意,后来将它与pimpl手法相对比,就大致理解了。

这种手法,我称为类pimpl手法,它通过写一个含有纯虚函数的C类,B类包含C类成员,同时A类继承C类,重写纯虚函数。这样在B类中调用C类成员函数时,最终调用的是A类的成员函数。

代码示例:

class C {
    
    
public:
	virtual void funcA() = 0;
	virtual void funcB() = 0;
};

class Base : public C {
    
    
public:
	void func()
	{
    
    
		std::cout << "func" << std::endl;
	}
	virtual void funcA()
	{
    
    
		std::cout << "funcA" << std::endl;
	}
	virtual void funcB()
	{
    
    
		std::cout << "funcB" << std::endl;
	}
};

class ClassA {
    
    
public:
	ClassA() : cbA(nullptr) {
    
    }

	void testA()
	{
    
    
		std::cout << "ClassA TestA\t";
		cbA->funcA();
	}
	void testB()
	{
    
    
		std::cout << "ClassA TestB\t";
		cbA->funcB();
	}
	void setC(C* cb) {
    
     cbA = cb;}

private:
	C* cbA;
};

int main()
{
    
    
	Base *b = new Base();
	b->func();
	b->funcA();
	ClassA *d = new ClassA();
	d->setC(b);

	d->testA();
	d->testB();

	return 0;
}

个人认为好处是,与pimpl一致,提高了封装性,减少了A类的接口暴露,也提高了编译速度。

与pimpl差异:
pimpl是封装了数据成员,而类pimpl手法则是封装了成员函数。

猜你喜欢

转载自blog.csdn.net/no_say_you_know/article/details/126061048