名前は同じですが、引数と戻り値の型が異なる仮想関数

mohit

私はインタビューでこの質問をされました。私の答えは(3と3.6)(間違った)でした。私の理解が間違っている理由を説明してください

私の考えでは、ポインタbdは派生クラスvtableの_vptrを指します。

派生クラスのVtableには2つの関数が含まれます

double func(double) // ----->points to Derived::func()
int func(int)       // ----->points to Base::func()

したがって、

bd->func(2)   // will call Base::func() i.e int func(int)
bd->func(2.3) // will call Derived::func() i.e double func(double)

私の理解がいかに間違っているか説明してください。また、そうBase::func()でない場合についても説明してくださいvirtualその場合、vtableはありませんよね?関数呼び出しはどのように解決されますか?

#include <iostream>    
using namespace std;

class Base
{
private:
    /* data */
public:
    Base(/* args */){};
    ~Base(){};

    //int func(int i)     getting same answer regardless of virtual
    virtual int func(int i)
    {
        cout << "Base func()" << endl;
        return i+1;
    }
};

class Derived : public Base
{
public:
    Derived(/* args */){};
    ~Derived(){};

    double func(double d)
    {
        cout << "Derived func()" << endl;
        return d+1.3;
    }
};

int main() {
    Base* bd = new Derived();
    cout << bd->func(2) << endl;
    cout << bd->func(2.3) << endl;
    return 0;
}

期待される出力:

Base func()
3
Derived func()
3.6

Actual output:
Base func()
3
Base func()
3
ジェスパー・ジュール

取って何も機能はありませんdoubleではBaseそして、あなたが持っているのはへのポインタだけですBase2.3なるように切り捨てられintた値2Base::func(int i)呼ばれています。

Derived::func(double d) このコードではまったく機能していません。

inはそうはないので、それfuncvirtualinBaseであるかどうかは関係ありません(署名が一致しません)。キーワードを追加すると、コンパイラエラーとしてすぐに明確になります。funcDerivedoverrideoverrideBase::func

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

戻り値の型は同じでパラメーターが異なる別の関数に関数を送信することはできますか?

分類Dev

同じ名前の関数の戻り値の型としてT&とTの両方がある場合にT&で関数を呼び出す方法

分類Dev

名前は同じで引数のタイプが異なる2つのR関数を作成します

分類Dev

F#では、アリティと戻り値の型が異なる2つの関数で名前を共有できますか?

分類Dev

Kotlinでは、戻り値の型が異なるプロパティゲッターと同じ関数シグネチャを使用できます

分類Dev

仮想関数が戻り値の型の推論を使用できないのはなぜですか?

分類Dev

名前が異なるが引数が同じ関数

分類Dev

戻り値の型が異なるScalaトレイトの同じメソッドと引数

分類Dev

同じ名前で異なる署名を持つ基本クラスの非仮想関数が見つかりません

分類Dev

同じ名前で戻り値の型が異なるメソッドを継承する

分類Dev

同じ名前、戻り値の型、異なるパラメーターを持つ2つの関数を宣言できますか

分類Dev

引数は異なりますが、関数の動作は同じです

分類Dev

関数内に同じ名前の変数を作成するときに、関数の引数が上書きされないのはなぜですか?

分類Dev

R:関数の引数と同じ名前の変数に名前を付ける必要がありますか?

分類Dev

Javaクラスには、関数シグネチャは同じですが戻り型が異なる2つのメソッドがあります

分類Dev

仮想関数について、*(int *)&bと(int *)*(int *)&bの出力値が異なるのはなぜですか?

分類Dev

同じ名前の別の関数内の内部関数に引数を渡すことができるのはなぜですか?

分類Dev

戻り値をCrystalの引数値と同じ型にする方法は?

分類Dev

同じ名前とパラメーター、異なる戻り値の型を持つC ++メンバー関数

分類Dev

同じ目的で引数の型が異なる2つの関数の代わりに1つの関数を作成することは可能ですか?(重複するコードを削除できますか?)

分類Dev

別の方法で引数を渡すと、関数は同じ値を出力する必要があります

分類Dev

関数の戻り値の型で引数の推論が許可されないのはなぜですか?

分類Dev

C ++ Koenig(引数依存)ルックアップ:異なる名前空間の2つの名前空間関数が同じ引数タイプを持っている場合はどうなりますか?

分類Dev

テンプレートパラメータとして同じ名前で引数タイプが異なる複数の関数

分類Dev

2つの異なる関数の配列引数とポインタ引数のアドレスが同じであるのはなぜですか?

分類Dev

戻り値の型が異なる関数ポインタC

分類Dev

戻り値の型が異なるC ++関数

分類Dev

戻り値の型が異なる関数ポインタ

分類Dev

このHaskell関数の戻り値が定義された関数の戻り値と異なるのはなぜですか?

Related 関連記事

  1. 1

    戻り値の型は同じでパラメーターが異なる別の関数に関数を送信することはできますか?

  2. 2

    同じ名前の関数の戻り値の型としてT&とTの両方がある場合にT&で関数を呼び出す方法

  3. 3

    名前は同じで引数のタイプが異なる2つのR関数を作成します

  4. 4

    F#では、アリティと戻り値の型が異なる2つの関数で名前を共有できますか?

  5. 5

    Kotlinでは、戻り値の型が異なるプロパティゲッターと同じ関数シグネチャを使用できます

  6. 6

    仮想関数が戻り値の型の推論を使用できないのはなぜですか?

  7. 7

    名前が異なるが引数が同じ関数

  8. 8

    戻り値の型が異なるScalaトレイトの同じメソッドと引数

  9. 9

    同じ名前で異なる署名を持つ基本クラスの非仮想関数が見つかりません

  10. 10

    同じ名前で戻り値の型が異なるメソッドを継承する

  11. 11

    同じ名前、戻り値の型、異なるパラメーターを持つ2つの関数を宣言できますか

  12. 12

    引数は異なりますが、関数の動作は同じです

  13. 13

    関数内に同じ名前の変数を作成するときに、関数の引数が上書きされないのはなぜですか?

  14. 14

    R:関数の引数と同じ名前の変数に名前を付ける必要がありますか?

  15. 15

    Javaクラスには、関数シグネチャは同じですが戻り型が異なる2つのメソッドがあります

  16. 16

    仮想関数について、*(int *)&bと(int *)*(int *)&bの出力値が異なるのはなぜですか?

  17. 17

    同じ名前の別の関数内の内部関数に引数を渡すことができるのはなぜですか?

  18. 18

    戻り値をCrystalの引数値と同じ型にする方法は?

  19. 19

    同じ名前とパラメーター、異なる戻り値の型を持つC ++メンバー関数

  20. 20

    同じ目的で引数の型が異なる2つの関数の代わりに1つの関数を作成することは可能ですか?(重複するコードを削除できますか?)

  21. 21

    別の方法で引数を渡すと、関数は同じ値を出力する必要があります

  22. 22

    関数の戻り値の型で引数の推論が許可されないのはなぜですか?

  23. 23

    C ++ Koenig(引数依存)ルックアップ:異なる名前空間の2つの名前空間関数が同じ引数タイプを持っている場合はどうなりますか?

  24. 24

    テンプレートパラメータとして同じ名前で引数タイプが異なる複数の関数

  25. 25

    2つの異なる関数の配列引数とポインタ引数のアドレスが同じであるのはなぜですか?

  26. 26

    戻り値の型が異なる関数ポインタC

  27. 27

    戻り値の型が異なるC ++関数

  28. 28

    戻り値の型が異なる関数ポインタ

  29. 29

    このHaskell関数の戻り値が定義された関数の戻り値と異なるのはなぜですか?

ホットタグ

アーカイブ