虚函数与访问权限

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

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下的函数 方便外部进行调用

相关推荐
qz5zwangzihan113 分钟前
题解:Atcoder Beginner Contest abc467 F - Email Scheduling Optimization
c++·贪心·atcoder·平衡树·abc467·abc467_f·fhq-treap
郝学胜-神的一滴1 小时前
中级OpenGL教程 023:Assimp模型加载全解——从源码到架构的骈文探秘
c++·unity·游戏引擎·cmake·unreal engine·opengl
星恒随风1 小时前
C++ STL 详解:list 的使用、迭代器失效、模拟实现与 vector 对比
开发语言·数据结构·c++·笔记·学习·list
牢姐与蒯1 小时前
c++之异常
开发语言·c++·c++11
此生决int1 小时前
深入理解C++系列(02)——类和对象(上)
开发语言·c++
zjun10012 小时前
C++:单例模式
c++·单例模式
同勉共进11 小时前
记一例 vibe coding + gcc bug 导致的线程池死锁问题
c++·线程池·gcc·死锁·vibe coding
我叫洋洋11 小时前
C ++ [ hello world ]
c语言·c++·算法
王维同学15 小时前
[自学][Windows C++]RunOnceEx 注册表分组键的安全遍历
c++·windows·安全·开源
Scott9999HH16 小时前
告别流量波动玄学!从法拉第电磁定律到底层 C/C++ 流量累积算法,深度解密工业级电磁流量计选型与开发
c语言·c++·算法