使用运算符重载来调用虚拟函数
Use an operator overload to call a virtual function
我想要一个可以从中继承并覆盖为[]运算符创建值的函数的类。为什么这些结果不一样?有没有一种方法可以在不使用指针的情况下获得第二个结果?
代码:
#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
的值初始化它。"请注意,a
是session
对象,它是而不是session2
对象。因此,它的虚拟方法将使用"父"的定义。因此,运行时多态性只通过引用和指针工作,它们不会创建新对象。它们只是指现有的对象。
如果不想使用指针,请使用引用。
session2 s2;
session& a = s2;
如果不使用指针或引用,将进行切片,派生对象的所有特殊内容都将丢失。将只剩下父级中的零件。
点击此处阅读更多关于切片的信息:什么是对象切片?
相关文章:
- 是否可以使用函数指针调用虚拟析构函数?
- 为什么使用存储在虚拟方法表中的地址调用虚拟函数的函数会返回垃圾?
- 使用回调函数从构造函数调用虚拟/派生方法的替代方法?
- 使用在堆栈上创建的对象调用虚拟函数
- 如何从派生类函数中调用虚拟函数
- 从内部类的析构函数调用虚拟函数
- 使用范围解析运算符时,在构造函数中调用虚拟方法是否安全?
- 调用虚拟成员类的方法
- 为什么不调用虚拟基非默认构造函数,除非大多数派生基显式调用它们?
- 为什么在运行时调用虚拟函数时需要虚拟表
- 从C++中的虚拟析构函数调用虚拟方法
- 如何在C++中调用虚拟析构函数
- 调用虚拟函数而不通过类类型指针创建任何对象
- 通过命名成员调用虚拟与地址或引用的区别
- 从派生的指针中调用虚拟功能,而无需支付VTable价格
- 为什么我不能从铸造的字节(char)数组中调用虚拟函数
- 在基类崩溃中调用虚拟功能
- 可以通过跨二进制边界传递的对象上的接口调用虚拟函数吗?
- 调用虚拟方法的不同方法
- C++未根据需要调用虚拟方法