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

时间:2013-08-01 21:10:03

标签: c++ inheritance operator-overloading virtual

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

代码:

#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

2 个答案:

答案 0 :(得分:1)

session a = s2;

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

答案 1 :(得分:1)

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

session2 s2;

session& a = s2;

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

详细了解此处切片:What is object slicing?