c+中的非虚拟指针+;? 是否有可能在C++中有一个“非虚指针”(即直接调用方法而不动态调度的指针)。这是因为我正在尝试这样做: template <typename T> class Ref { T* value; // I am 100% sure that value points to an actual T object. /* constructors and stuff */ auto operator -> () { return value; } };

c+中的非虚拟指针+;? 是否有可能在C++中有一个“非虚指针”(即直接调用方法而不动态调度的指针)。这是因为我正在尝试这样做: template <typename T> class Ref { T* value; // I am 100% sure that value points to an actual T object. /* constructors and stuff */ auto operator -> () { return value; } };,c++,polymorphism,virtual,c++20,C++,Polymorphism,Virtual,C++20,但这似乎是用户的另一个负担。这是如何自动完成的?假设您的类T用final标记其虚拟函数,那么函数调用应该在所有现代编译器上都进行虚拟化 见: 当我知道值的动态类型为T 您可能知道/假设这一点,但是目前,C++中没有任何机制可以使语言知道/假设任何给定的指针/对象的引用。如果它是多态类型,那么调用任何virtual函数(除非调用方明确指定其他)都将使用动态分派。您能给出一个实际的用例吗?这可能会打破继承层次结构设计者的假设,听起来有点像X/Y问题。切片是一种选择吗?您的成员函数真的需要是虚拟的吗?

但这似乎是用户的另一个负担。这是如何自动完成的?

假设您的类
T
final
标记其虚拟函数,那么函数调用应该在所有现代编译器上都进行虚拟化

见:

当我知道值的动态类型为
T


您可能知道/假设这一点,但是目前,C++中没有任何机制可以使语言知道/假设任何给定的指针/对象的引用。如果它是多态类型,那么调用任何

virtual
函数(除非调用方明确指定其他)都将使用动态分派。

您能给出一个实际的用例吗?这可能会打破继承层次结构设计者的假设,听起来有点像X/Y问题。切片是一种选择吗?您的成员函数真的需要是虚拟的吗?我能想到的唯一解决方案是相当重的重量。提供一个代理类,该类包含
T
的一个实例,提供与
T
相同的成员函数集,所有这些函数都是非虚拟的,并实现所有这些函数,以便它们转发到contain
T
。指针不是虚拟的(没有这类东西)。方法调用是虚拟的。这在你的课堂之外。@sweenish-这个链接与这个问题相反。这是关于如何在没有任何虚拟函数的情况下获得类似于虚拟函数的行为,而这个问题是关于如何防止虚拟函数在没有调用者干预的情况下被虚拟调用。这可能是真的,但并不能解决问题,因为你不能强迫用户这样做。没有其他方法(我知道)避免对
virtual
方法调用的动态调度。这不应该被“虚拟化”吗?
X->Base::foo();