请看下面的代码清单:
#include <iostream>
using namespace std;
class Base {
public:
virtual void Message() = 0;
};
class Intermediate : public Base {
};
class Final : public Intermediate {
void Message() {
cout << "Hello World!" << endl;
}
};
int main() {
Final final;
/* Wont work (obviously):
Final* finalPtr = &final;
finalPtr->Message();
*/
// Works:
Intermediate* finalPtr = &final; // or Base* finalPtr = &final;
finalPtr->Message();
return 0;
}
请注意以下事项:
- 在摘要中Base类,纯虚函数信息()是公开的
-
中间的类(也是抽象的)继承自Base类(是否信息()函数保持公共纯虚拟中间的?)
-
Final类继承自中间的类和message() 函数是私有的(默认情况下)
- 主要是一个类型的对象Final被建造
- An 中间的指向的指针Final对象被创建
问题:如果运行该程序,该行FinalPtr->消息();成功调用Final的实施信息()功能尽管其private。这是怎么发生的?基类是否会覆盖或忽略派生类的访问限制?
相关问题:关于上面的(2.),定义的正确方法是什么中间的班级?是否需要重新声明纯虚函数信息()从基类开始,记住中间的类并不旨在提供实现。
NOTE:代码已使用 Digital Mars Compiler (dmc) 和 Microsoft's Visual Studio Compiler (cl) 进行了测试,并且在两者中都运行良好
这是怎么发生的?基类是否会覆盖或忽略派生类的访问限制?
通过公共继承,基类的所有公共成员都将成为派生类的公共成员。所以是的Message()
是公共职能Intermediate
.
该函数在基类上调用(Intermediate
) 指针该函数在基类中是公共的。动态调度(即对派生类函数的实际调用)仅在运行时发生,因此这是有效的。
上面的原因是,在运行时,访问说明符没有任何意义,访问说明符规则仅在编译时解析并生效。
如果您在派生类指针上调用该函数,那么在编译时编译器会检测到Message()
被宣布private
in Final
因此它给出了错误。
当从抽象类派生时,派生类MUST提供定义ALL基类的纯虚函数,不这样做将导致派生类也是抽象类。
Here Intermediate
class 是一个抽象类,只要您不需要创建该类的对象,它就可以正常工作。请注意,您可以创建指向抽象类的指针。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)