1

このコードから始めます:

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

dがオブジェクトの場合Derived、このオブジェクトの Base クラスで定義されている foo メソッドを何らかの方法で呼び出すことはできますか?

編集:d.foo() Base::foo() にバインドするように、外部から意味します

4

3 に答える 3

6

Derived呼び出しを修飾するだけです(実際にはから継承すると仮定Baseしますが、コードでは継承しません)。

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

さて、これは実行可能ですが、それもかなり疑わしいです。メソッドが仮想である場合、それはオーバーライドされることを意味し、ユーザーは特定のオーバーライドを呼び出すべきではありませんが、final-overriderを呼び出す必要があります。そうしないと、クラスの不変条件を完全に壊してしまうリスクがあります。

の実装は、不変条件を保持するために必要な追加の作業を行ったことを考慮してください。Derived::fooユーザーBase::fooが追加の作業は行われず、不変条件が壊れて、オブジェクトが無効な状態になると言った場合。

于 2012-05-04T17:29:14.883 に答える
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 に答える
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 に答える