具有相同名称但不同参数和 return 类型的虚函数
Virtual functions with same name but different arguments and return types
我在面试中被问到这个问题。我的回答是(3 和 3.6)(错误)。
请解释我的理解是错误的
我的想法是指针 bd 将指向派生的 class vtable 的 _vptr。
Derived 的 Vtable class 将包含 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
Base
中没有采用 double
的函数。你所拥有的只是一个指向 Base
的指针。因此 2.3 被截断为 int
值 2
并调用 Base::func(int i)
。
Derived::func(double d)
在此代码中根本没有发挥作用。
func
在Base
中是virtual
并不重要,因为Derived
中的func
不是override
(签名不匹配)。将 override
关键字添加到 Base::func
将立即清除编译器错误。
我在面试中被问到这个问题。我的回答是(3 和 3.6)(错误)。 请解释我的理解是错误的
我的想法是指针 bd 将指向派生的 class vtable 的 _vptr。
Derived 的 Vtable class 将包含 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
Base
中没有采用 double
的函数。你所拥有的只是一个指向 Base
的指针。因此 2.3 被截断为 int
值 2
并调用 Base::func(int i)
。
Derived::func(double d)
在此代码中根本没有发挥作用。
func
在Base
中是virtual
并不重要,因为Derived
中的func
不是override
(签名不匹配)。将 override
关键字添加到 Base::func
将立即清除编译器错误。