C++ 函数重写

标签 c++ function polymorphism overriding

我有三个不同的基类:

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/

相关文章:

c - 在 C 中返回二维字符数组

c++ - 函数参数 : vector<Clazz*>& vs vector<Clazz>&

c++ - 如何取消初始化 C++ 中的对象?

c++ - first catch 捕获任何类型

javascript - 调用随机函数 Javascript,但不是两次相同的函数

Javascript 变量范围和值

c++ - 在 SQLite 中检索所有项目的最快方法是什么?

c++ - 现代编译器会自动优化以下 C++ 代码吗?

ruby-on-rails - 使用它的多个属性的 Rails 多态关联

c++ - 是否可以使用 placement-new 来改变多态对象的类型?