C++ C++;:如何从外部调用父类函数
我有: 我想直接使用“ptr”指针调用A的C++ C++;:如何从外部调用父类函数,c++,inheritance,pointers,virtual,C++,Inheritance,Pointers,Virtual,我有: 我想直接使用“ptr”指针调用A的foo() 当我尝试 class A{ public: virtual void foo(); }; class B : public A{ public: void foo(); }; B *ptr = new B(); 它仍然调用B版本的foo()。我怎么称呼A的版本呢 这可能吗?有哪些替代方案?谢谢。使用:范围解析表单命名函数时,调用命名函数,就好像它不是虚拟函数一样 (A*)ptr->f
foo()
当我尝试
class A{
public:
virtual void foo();
};
class B : public A{
public:
void foo();
};
B *ptr = new B();
它仍然调用B版本的foo()
。我怎么称呼A的版本呢
这可能吗?有哪些替代方案?谢谢。使用
:
范围解析表单命名函数时,调用命名函数,就好像它不是虚拟函数一样
(A*)ptr->foo();
你需要公开你的职能。您只需进行以下更改即可完成此操作:
ptr->A::foo();
如果您不这样做,这些函数将自动成为私有函数,并且从“外部”无法访问。请看一看,您能否澄清“不工作”是什么意思?当您尝试上述代码时,会发生什么情况?这样做完全违背了使函数虚拟的目的,因此这意味着类
a
的用户正在逃避类设计者的意图。这可能意味着某个地方存在设计错误:a
不能提供所需的所有功能,或者A
的用户不明白A
应该做什么。@代码大师:因为成员函数是虚拟的,它将被分派到最终重写器,而不管指针的静态类型如何(即强制转换是无用的),除非您在操作中禁用调用的动态分派…@DavidRodríguez dribeas,该函数甚至不是公共的,因此代码甚至不应该编译,分派也不会成为问题。因此,为什么我问在这种情况下“不起作用”是什么意思。我有点不安,我花时间回答了错误的问题,因为OP不完整…+1。这是正确的,不过如果你也在OP的代码中讨论可访问性问题会更好。@Nawaz:如果还提到这违反了所有OO原则,那就更好了:)B
的用户不应该关心foo
的哪个版本,这是多态性的主要点。它们是公开的,我只是没有在示例中指定它。@nahpr为了将来的参考,我建议您尽量避免在这里发布的代码中引入额外的错误。这将有助于避免浪费你的时间来整理无用的答案。
class A{
public:
virtual void foo();
};
class B : public A{
public:
void foo();
};