指向派生类的基类指针无法访问派生类方法

问题描述 投票:0回答:2

我正在学习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一样执行。为什么会这样?

c++ c++11 virtual-functions dynamic-binding method-hiding
2个回答
0
投票

具有相同名称但签名不同的功能本质上是不同的功能。

通过在virtual void describe(int dummy)类中声明Dragon,您已经声明了一个新的虚函数,而不是覆盖原始的虚函数(virtual void describe()中的Enemy)。您只能覆盖具有相同签名的虚函数。


0
投票

在C ++中,具有相同名称但参数不同的函数是完全独立的函数,与彼此无关

© www.soinside.com 2019 - 2024. All rights reserved.