9

我有:

class A{
    public:
        virtual void foo();
};

class B : public A{
    public:
        void foo();
};

B *ptr = new B();

我想foo()使用'ptr'指针直接调用A。

当我尝试

(A*)ptr->foo();

它仍然调用 B 的版本foo()。我怎么称呼A的版本呢?

这可能吗?有哪些替代方案?谢谢你。

4

2 回答 2

19

当你用::作用域解析形式命名一个函数时,你调用了命名函数,就好像它不是虚拟的一样。

ptr->A::foo();
于 2012-08-29T16:35:52.900 回答
2

您需要公开您的功能。您只需进行以下更改即可做到这一点:

class A{
    public:
        virtual void foo();
};

class B : public A{
    public:
        void foo();
};

如果您不这样做,这些功能将自动成为私有的,并且无法从“外部”访问。

于 2012-08-29T16:36:45.587 回答