最近学习看到父类有私有虚函数所以记录一下,很基础但是理解了会更懂类,有错望指出~
基础格式
#include <iostream>
using namespace std;
class A {
public:
void func1() {cout << "base func1" << endl; }
private:
virtual void func2() = 0; //关键看这里
};
class B :public A{
public:
void func2() { cout << "B func2" << endl;}
};
int main() {
B b;
A* aptr = &b;
aptr->func1();
b.func1();
b.func2();
return 1;
}
输出结果:
base func1
base func1
B func2
首先我们可以回顾一下,类中public、private、protect的作用是确定访问权限,而虚函数是为了让子类修改从而实现多态。
private属性标志这此属性或方法只能由类内访问,此时又定义为virtual让子类去重写,咋一看有点矛盾,但实际上虚函数的访问级别不约束它在派生类内部被重写的能力。
一个例子
在多线程编程中有个方式用到这样的写法,可以参考一下父类私有虚函数有什么用
#include <iostream>
#include <thread>
using namespace std;
class XThread
{
public:
virtual void Start()
{
th_ = std::thread(&XThread::Main, this); //入口函数mian + 本对象,重点看这里
}
virtual void Stop() { }
virtual void Wait() { }
bool is_exit() { return is_exit_; }
private:
virtual void Main() = 0; //具体操作在子类实现,但是这里需要配合start函数做声明,所以可写成私有虚函数,关键看这里
std::thread th_;
bool is_exit_ = false;
};
class TestXThread :public XThread
{
public:
void Main() override
{
cout << "TestXThread Main begin" << endl;
}
string name;
};
int main(int argc, char* argv[])
{
TestXThread testth;
testth.name = "TestXThread name ";
testth.Start();
this_thread::sleep_for(3s);
testth.Stop();
return 0;
}
上边的例子目的是封装线程基类接口,删除了不关键的实现,关注主题看有注释的地方。
基类XThread的Start方法里用到了本类的Main入口函数,同时将入口函数定义为virtual使得子类可以进行重写。定义一个子类TestXThread对象,将可运行其重写的入口函数。
btw可以拓展一下去了解一下前置声明的概念~
-EOF
加油