虚函数与访问权限

子类重写虚函数与在什么访问权限有什么关系?

1.能不能调用 看静态类型
复制代码
class base
{
private:
	virtual void say(){cout<<"base"<<endl;}	
};

class child :public base
{
public:
	virtual void say(){ cout<<"child"<<endl;}	
};

int main()
{
	base* a = new child;
	a->say();
	return 0;
}

这段代码编译会报错, 因为a的静态类型是base,base里say()的权限是private,不能访问

编译期访问检查只基于静态类型,与是否被 override 无关

2.调用了什么 看动态类型
复制代码
class base
{
public:
	virtual void say(){cout<<"base"<<endl;}	
};

class child :public base
{
private:
	virtual void say() override { cout<<"child"<<endl;}	
};

int main()
{
	base* a = new child;
	a->say();
	return 0;
}

这段代码可以运行 输出child

虽然a的动态类型是child 并且child里say的权限是private

但程序依然可以调用并进行动态分发 找到child里的对应函数

3.子类不可以调用父类的private函数
复制代码
class base
{
public:
	void testbase(){say();}
private:
	virtual void say(){cout<<"base"<<endl;}	
};

class child :public base
{
private:
	virtual void say() override { base::say(); cout<<"child"<<endl;}	
};

int main()
{
	base* a = new child;
	a->testbase();
	return 0;
}

这段代码错在base::say(),子类不能调用父类的private函数 与是否重写无关

总结:

访问权限只在编译时进行限制,运行期间虚函数的动态分发是不关心访问权限的

注意:

1.父类的private虚函数 可以在子类public下重写

但是子类不能调用父类的版本,

在外部不能通过父类的指针调用该函数

2.子类在private下重写了父类的public函数,

虽然不能用子类的指针调用它自己的函数

依然可以用父类的指针调用子类的版本

使用建议:

访问权限最好在父类就设计好

放在private下的函数 子类只能替换实现 不方便扩展

放在protected下的函数 子类可以很方便地扩展

放在public下的函数 方便外部进行调用

相关推荐
Thera7779 小时前
C++ 高性能时间轮定时器:从单例设计到 Linux timerfd 深度优化
linux·开发语言·c++
君义_noip10 小时前
信息学奥赛一本通 1952:【10NOIP普及组】三国游戏 | 洛谷 P1199 [NOIP 2010 普及组] 三国游戏
c++·信息学奥赛·csp-s
旖-旎11 小时前
二分查找(x的平方根)(4)
c++·算法·二分查找·力扣·双指针
顶点多余11 小时前
使用C/C++语言链接Mysql详解
数据库·c++·mysql
汉克老师11 小时前
GESP2026年3月认证C++四级( 第二部分判断题(1-10))
c++·指针·函数重载·文件操作·数组·gesp4级·gesp四级
khddvbe12 小时前
C++并发编程中的死锁避免
开发语言·c++·算法
wWYy.13 小时前
STL:list
开发语言·c++
小比特_蓝光13 小时前
vector模拟实现
c++
咱就是说不配啊13 小时前
3.19打卡day33
数据结构·c++·算法
2501_9249526914 小时前
嵌入式C++电源管理
开发语言·c++·算法