我希望有一个可以继承的类,并覆盖为[]运算符创建值的函数。为什么这些结果不一样?有没有办法在不使用指针的情况下获得第二个结果?
代码:
#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
答案 0 :(得分:1)
session a = s2;
这意味着“创建一个新的session
对象,并从s2
的值初始化它。”请注意,a
是一个session
对象,不是一个session2
对象。因此,它的虚方法将使用“父”的定义。因此,运行时多态性只能通过引用和指针工作,这些引用和指针不创建新对象。他们只是引用现有的对象。
答案 1 :(得分:1)
如果您不想使用指针,请使用引用。
session2 s2;
session& a = s2;
如果你不使用指针或引用,将会进行切片,并且有关派生对象的所有特殊内容都将丢失。只剩下父母的部分。
详细了解此处切片:What is object slicing?