在大佬的代码中看到经常使用这种结构,于是研究了一下,最开始没太看懂用意,后来将它与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手法则是封装了成员函数。