使用基类虚方法

时间:2012-05-04 17:23:13

标签: c++

从这段代码开始:

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

如果dDerived对象,我是否可以某种方式调用此对象的Base类中定义的foo方法?

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

3 个答案:

答案 0 :(得分: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;
}

答案 1 :(得分:6)

只需限定通话费用(假设Derived实际上继承自Base,而代码中没有Derived d; d.Base::foo();

Derived::foo

现在,虽然这是可行的,但也很值得怀疑。如果该方法是虚拟的,则意图覆盖并且用户不应该调用特定的覆盖,而是 final-overrider ,否则它们可能会一直破坏类不变量。

考虑到Base::foo的实现需要一些额外的工作来保持一些不变量,如果用户调用{{1}}将无法完成额外的工作而且不变量被破坏,使对象无效状态。

答案 2 :(得分: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();