3

次のコードにはバグがあります: 最後の行は次のようになるはずです
bp->g();
. 問題は, その行をコメントアウトすると,bp->f()実際には派生バージョンを呼び出す. したがって, コンパイラは bp を Derived クラスとして扱うと仮定します. 次に, g を呼び出すと, コンパイラはなぜBasebpとして扱います.ポインター。

ありがとう!

#include <iostream>
using namespace std;

class Base {
public:
    virtual void f() const { cout << "Base::f()\n"<< endl; }
    virtual void g() const { cout << "Base::g()\n"<< endl; }
};

class Derived : public Base {
public:
    void f() const {cout << "Derived::f()" << endl; }
    void g(int) const {cout << "Derived::g()" << endl; }
};

int main() {
    Base* bp = new Derived;
    bp->f();
    bp->g(1);
}
4

4 に答える 4

0

実際、あなたのサンプルは行 bp->g(1); でコンパイル時エラーを与えるはずです。どちらの場合も、コンパイラは bp を Base* として扱い、2 つの仮想関数 void f() と void g() があり、f() が Derived でオーバーライドされているため、bp->f() を呼び出すと、派生バージョンが vtable 経由で呼び出されます。ただし、Base には void g(int) がないため、bp->g(1) はコンパイル時エラーにつながります。

于 2013-04-07T16:09:56.530 に答える