C++父类私有虚函数

最近学习看到父类有私有虚函数所以记录一下,很基础但是理解了会更懂类,有错望指出~

基础格式

#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
加油

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值