私はインタビューでこの質問をされました。私の答えは(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
。そして、あなたが持っているのはへのポインタだけですBase
。2.3なるように切り捨てられint
た値2
とBase::func(int i)
呼ばれています。
Derived::func(double d)
このコードではまったく機能していません。
inはそうではないので、それfunc
がvirtual
inBase
であるかどうかは関係ありません(署名が一致しません)。にキーワードを追加すると、コンパイラエラーとしてすぐに明確になります。func
Derived
override
override
Base::func
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加