我正在学习C ++ 11中的继承,并且我发现,如果派生类重新定义了虚函数名称,但原型不同,则分配有指向派生类的指针的基类指针只能访问基类。函数的类版本。无法访问派生的版本功能。我不知道为什么会这样。
class Enemy {
public:
virtual void describe() { std::cout << "Enemy"; }
};
class Dragon : public Enemy {
public:
virtual void describe(int dummy) { std::cout << "Dragon"; }
};
在main
中,
Dragon foo;
Enemy* pe = &foo;
pe->describe(); // Enemy
foo.describe(1); // Dragon
pe->describe(1); // no matching function, candidate is Enemy::describe()
根据我对虚函数表的了解,pe
指向的派生对象(即foo
)应具有指向Dragon
的vtable的vpointer成员。我也知道,在派生类中重新定义函数名称将在基类中隐藏相同名称的所有函数。因此,在Dragon的vtable中,“ describe”的地址应为带有参数int dummy
的函数。
但是事实证明,pe
可以访问应该隐藏的Enemy
方法版本。并且pe
无法访问该方法的Dragon
版本,该版本应该在pe
的vtable中。就像使用Enemy
的vtable一样执行。为什么会这样?
具有相同名称但签名不同的功能本质上是不同的功能。
通过在virtual void describe(int dummy)
类中声明Dragon
,您已经声明了一个新的虚函数,而不是覆盖原始的虚函数(virtual void describe()
中的Enemy
)。您只能覆盖具有相同签名的虚函数。
在C ++中,具有相同名称但参数不同的函数是完全独立的函数,与彼此无关