-2

以下はC++コードです:

#include<iostream>
using namespace std;
class Base {
    public:
          virtual int f() const { cout << "Base::f()\n"; }
          virtual void f(string) const {}
          virtual void g() const {}
};

class Derived4 : public Base {
    public:
          int f(int) const { cout << "Derived4::f()\n"; }
};
int main() {
    string s ("hello");
    Derived4 d4;
    Base *br = &d4; //line 5
    //br->f(1);//line 6
    br->f();//line 7
    br->f(s);//line 8
}

コードは正常に動作していますが、6行目はエラーです。コードは f() の基本バージョンを呼び出しています。また、派生クラスで関数を再定義すると、その関数のすべての基本クラス定義がすべて非表示になることも読みましたか? 私が間違っている?

4

1 に答える 1

2

コンパイルエラーの数があります。脇に置いて -

ポリモーフィズムは実行時の概念です。そのため、関数呼び出しのディスパッチ メカニズムは実行時に発生します。それが機能するには、基本クラスと派生クラスで同じメンバー関数のシグネチャが必要です。

br->f(1);//line 6

コンパイル時に、コンパイラは で使用可能なメンバー関数のシグネチャと一致させようとしますBase。この場合、f(string)文字列型を受け入れるため、エラーが発生します。

また、派生クラスで関数を再定義すると、その関数のすべての基本クラス定義がすべて非表示になることも読みましたか?

それは別のシナリオです。

struct foo{
   fooBar(int i);
};

struct bar:foo{
   fooBar(std::string);
};

void test()
{
    bar obj;
    obj.fooBar(11); // bar class hides the member function foo::fooBar(int)
}
于 2013-06-25T19:14:08.587 に答える