0

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

代码:

#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
4

2 回答 2

1

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

session2 s2;

session& a = s2;

如果您不使用指针或引用,则会进行切片,并且派生对象的所有特殊内容都将丢失。只剩下父级的部分。

在此处阅读有关切片的更多信息:什么是对象切片?

于 2013-08-01T21:20:52.323 回答
1
session a = s2;

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

于 2013-08-01T21:18:31.200 回答