我有三个不同的基类:
class BaseA
{
public:
virtual int foo() = 0;
};
class BaseB
{
public:
virtual int foo() { return 42; }
};
class BaseC
{
public:
int foo() { return 42; }
};
然后我像这样从基数派生(用 X 代替 A、B 或 C):
class Child : public BaseX
{
public:
int foo() { return 42; }
};
三个不同基类中的函数是如何被覆盖的?我的以下三个假设是否正确?还有其他注意事项吗?
- 使用 BaseA,子类无法编译,也没有定义纯虚函数。
- 使用 BaseB,当在 BaseB* 或 Child* 上调用 foo 时,子函数中的函数会被调用。
- 使用 BaseC,当在 Child* 上调用 foo 而在 BaseB* 上调用 foo 时,子类中的函数会被调用(调用父类中的函数)。
最佳答案
要记住的重要规则是,一旦函数被声明为虚拟,派生类中具有匹配签名的函数始终是虚拟的。因此,它被 A 的 Child 和 B 的 Child 覆盖,它们的行为相同(除了不能直接实例化 BaseA)。
然而,在 C 中,函数不是被覆盖,而是被重载。在这种情况下,只有静态类型很重要:它会根据指向的指针(静态类型)而不是对象的真正含义(动态类型)调用它
关于C++ 函数重写,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1027724/