【问题标题】:Use an operator overload to call a virtual function使用运算符重载调用虚函数
【发布时间】:2013-08-02 23:59:09
【问题描述】:

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

代码:

#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

【问题讨论】:

  • 没有。 slicing
  • 你可以让操作符虚拟化。

标签: c++ inheritance operator-overloading virtual


【解决方案1】:
session a = s2;

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

【讨论】:

    【解决方案2】:

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

    session2 s2;
    
    session& a = s2;
    

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

    在此处阅读有关切片的更多信息:What is object slicing?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-21
      • 1970-01-01
      • 2011-01-27
      相关资源
      最近更新 更多