3

たとえば、次のようなクラスがあります。

class Base
{
   public: void SomeFunc() { std::cout << "la-la-la\n"; }
};

私はそれから新しいものを導き出します:

class Child : public Base
{
   void SomeFunc()
   {
      // Call somehow code from base class
      std::cout << "Hello from child\n";
   }
};

そして私は見たい:

la-la-la
Hello from child

派生クラスからメソッドを呼び出すことはできますか?

4

5 に答える 5

10

もちろん:

void SomeFunc()
{
  Base::SomeFunc();
  std::cout << "Hello from child\n";
}

ところで、Base::SomeFunc()宣言されていないので、それをオーバーライドするのではなく、基本クラスにvirtual隠しDerived::SomeFunc() ます。これは、長期的には確かにいくつかの厄介な驚きを引き起こすでしょう。したがって、宣言を次のように変更することをお勧めします

public: virtual void SomeFunc() { ... }

Derived::SomeFunc() virtual明確にするために、明示的に宣言することをお勧めしますが、これも自動的に行われます。

于 2010-10-20T16:17:34.343 に答える
4
class Child : public Base
{
   void SomeFunc()
   {
      // Call somehow code from base class
      Base::SomeFunc();
      std::cout << "Hello from child\n";
   }
};

ところで、あなたも作りたいかもしれませんDerived::SomeFunc public

于 2010-10-20T16:17:05.787 に答える
1

これを行うには、親のクラス名を前に付けて関数を再度呼び出します。SomeFuncという名前の関数を提供する複数の親が存在する可能性があるため、クラス名の前にプレフィックスを付ける必要があります。SomeFuncという名前の無料の関数があり、代わりにそれを呼び出したい場合は、::SomeFuncがジョブを実行します。

于 2010-10-20T16:22:13.513 に答える
0
class Child : public Base
{
   void SomeFunc()
   {
      Base::SomeFunc();
      std::cout << "Hello from child\n";
   }
};
于 2010-10-20T16:18:28.433 に答える
0

はい、できます。メソッドに修飾せずに同じ名前を付けたことに注意してくださいvirtual。コンパイラもそれに気付くはずです。

class Child : public Base
{
   void SomeFunc()
   {
      Base::SomeFunc();
      std::cout << "Hello from child\n";
   }
};
于 2010-10-20T16:19:44.180 に答える