1

从这段代码开始:

class Base{
public:
    virtual void foo(){....}
};
class Derived{
public:
    void foo(){....}
};

如果d是一个Derived对象,我可以以某种方式调用基类中为该对象定义的 foo 方法吗?

编辑:我的意思是从外部,这样d.foo()绑定到 Base::foo()

4

3 回答 3

6

在调用中明确指定它。

#include <iostream>

class Base{
public:
    virtual void foo(){
      std::cout << "Base" << std::endl;
    }
};
class Derived : public Base{
public:
    void foo(){
      std::cout << "Derived" << std::endl;

    }
};

int main()
{
  Derived d;
  d.Base::foo();
  return 0;
}
于 2012-05-04T17:26:42.703 回答
6

只需限定调用(假设Derived实际上继承自Base,在您的代码中它没有):

Derived d;
d.Base::foo();

现在,虽然这是可行的,但也很值得怀疑。如果该方法是虚拟的,则意味着要被覆盖,并且用户不应调用特定的覆盖,而是调用final-overrider,否则他们冒着破坏类不变量的风险。

考虑到实现Derived::foo需要做一些额外的工作来保持一些不变量,如果用户调用Base::foo这些额外的工作将不会完成并且不变量被破坏,从而使对象处于无效状态。

于 2012-05-04T17:29:14.883 回答
3

要从外部代码调用它,您仍然可以在调用中明确限定名称:

#include <iostream>
#include <vector>

struct base { 
    virtual void do_something() { std::cout << "Base::do_something();\n"; }
};

struct derived : public base { 
    virtual void do_something() { std::cout << "derived::do_something();\n"; }
};

int main() {

    derived d;

    d.base::do_something();
    return 0;
}

如果您使用指向对象的指针,则将其更改为d->base::do_something();.

于 2012-05-04T17:28:40.500 回答