c++ - Accessing Private function using virtual function
问题描述
How to avoid The private function calling indirectly using base class virtual function.
class baseclass{
public:
virtual void printmynumber() = 0;
};
class derivedclass : public baseclass
{
private:
int m_mynumber;
void printmynumber()
{
cout << m_mynumber << endl;
}
public:
derivedclass(int n)
{
m_mynumber = n;
}
};
void main()
{
baseclass *bObj = new derivedclass(10);
bObj->printmynumber();
delete bObj;
}
How to avoid the calling of private function?
解决方案
你不能用继承来做到这一点。给定一个指向 的指针baseclass
,编译器只知道它有一个public
virtual
函数,因此允许相应地调用该函数。
派生类选择从基类继承,并实现了具有不同访问权限的功能。但这些都是不可见的,只给出了一个指向基础的指针。
没有什么可以阻止derivedclass::printmynumber()
实现什么都不做 - 这意味着如果代码调用它,将不会有可观察的效果(假设没有预期的效果是可以容忍的)。
真正的解决方案是修复您的设计,而不是试图解决其中的缺陷。不要继承derivedclass
自baseclass
. 那样的话,根本derivedclass
就不能调用 of 的成员函数,只给出指向 的指针baseclass
,因为类型不相关(将 a 传递derivedclass *
给期望 a 的函数baseclass *
通常会被诊断为错误)。
顺便说一句: main()
返回int
,不是void
。一些编译器支持void main()
非标准扩展(并且其中一些编译器的文档错误地描述了标准这样的东西),但最好避免使用。
推荐阅读
- swift - viewDidDisappear 在主线程上吗?
- chart.js - 从点样式图例中删除 ChartJS 2 边框和阴影
- spring - Spring Boot 中的 Freemarker 模板渲染错误返回 200 OK
- java - Selenium Java 测试等待重定向完成
- sql - SQL 在使用减法运算时考虑重复
- java - Java GUI:repaint() 或类交互问题
- javascript - 选择的悬停背景 - 默认 chrome 如何更改为其他
- html - 如何包含 css 父编号 html?
- python - Python 使用 len() 方法列出计数
- python - 高基数数据的挑战