使用运算符重载来调用虚拟函数

Use an operator overload to call a virtual function

本文关键字:调用 虚拟 函数 重载 运算符      更新时间:2023-10-16

我想要一个可以从中继承并覆盖为[]运算符创建值的函数的类。为什么这些结果不一样?有没有一种方法可以在不使用指针的情况下获得第二个结果?

代码:

#include <iostream>
using std::cout;
class session {
  public:
    session(){}
    ~session(){}
    void operator[](const char* c) {foo(c);}
  protected:
    virtual void foo(const char* c) {cout << "parent called" << "n";}
};
class session2 : public session {
  public:
    session2(){}
    ~session2(){}
  protected:
    virtual void foo(const char* c) {cout << c << "n";}
};
int main() {
  session2 s2;
  session a = s2;
  a["child called"];
  session* b = &s2;
  (*b)["child called"];
  return 0;
}

输出:

parent called
child called
session a = s2;

这意味着"创建一个新的session对象,并从s2的值初始化它。"请注意,asession对象,它是而不是session2对象。因此,它的虚拟方法将使用"父"的定义。因此,运行时多态性只通过引用和指针工作,它们不会创建新对象。它们只是指现有的对象。

如果不想使用指针,请使用引用。

session2 s2;
session& a = s2;

如果不使用指针或引用,将进行切片,派生对象的所有特殊内容都将丢失。将只剩下父级中的零件。

点击此处阅读更多关于切片的信息:什么是对象切片?