C++ 调用重载的父对象';C++;

C++ 调用重载的父对象';C++;,c++,templates,inheritance,crtp,overload-resolution,C++,Templates,Inheritance,Crtp,Overload Resolution,我试图理解是否可以从子类调用父函数成员 基本上我有以下代码: struct Parent { template<class... Args> void doFoo(Args&&... args) { std::cout << "parent doFoo"; } template<class... Args> void foo(Args&&... args)

我试图理解是否可以从子类调用父函数成员

基本上我有以下代码:

struct Parent
   {
   template<class... Args>
   void doFoo(Args&&... args)
     {
     std::cout << "parent doFoo";
     }

   template<class... Args>
   void foo(Args&&... args)
     {
     doFoo(args...);
     }
   };

 struct Child : Parent
   {
     template<class... Args>
     void doFoo(Args&&... args)
       {
       std::cout << "child doFoo";
       }
   };

   Child c;
   c.foo(); // This should invoke Child::doFoo()
结构父级 { 模板 void doFoo(Args&…Args) {
std::cout我不知道这是否是一个选项,但是如果您能够负担模板类而不是方法,那么您可以将“doFoo”设置为虚拟,然后它就可以按照您的预期工作

#include <iostream>

template <typename ... Args>
struct Parent
   {
   virtual void doFoo(Args&&... args)
     {
     std::cout << "parent doFoo";
     }

   void foo(Args&&... args)
     {
     doFoo(args...);
     }
   };

template <typename ... Args>
 struct Child : Parent <Args...>
   {
     void doFoo(Args&&... args) override
       {
       std::cout << "child doFoo";
       }
   };

int main()
{
   Child<> c;
   c.foo(); // This should invoke Child::doFoo()
}
#包括
模板
结构父级
{
虚拟void doFoo(Args&&…Args)
{

std::不清楚“类似技术”是什么意思。可以使用[static | dynamic]_例如,cast。好的,我将取消该要求。除了引入开销的选项外,每个选项都是可以的。实际上,这并不十分清楚。您已经在使用CRTP关键字。您在实现该关键字时有困难吗?我想知道是否有其他方法可以做到这一点,或者CRTP是否是唯一的解决方案注意。也有不同的方法来实现它。我想我假设还有其他解决方案。但是CRTP有什么问题?有趣的解决方案,谢谢分享。事实是它使用了虚拟关键字,我想避免任何额外的费用。你说的“开销”是什么意思还有,你想要多态性而不需要虚拟关键词,这甚至没有意义。阿图尔:只是谷歌虚拟C++开销来理解我的意思。mean@Saturnu我相信上面的多态性可以在编译时确定,并且遵循CRTP的相同思想,记住了这一点,使用您提供的wikipedia链接,我们得到了:如何然而,在许多情况下,所需的多态行为是不变的,并且可以在编译时确定可以用来实现静态多态性,这是对编程代码中多态性的一种模仿,但它在编译时得到解决,因此不需要运行时虚拟表查找。我想你不明白我刚才所说的,它是在编译时确定的,即使使用virtual关键字也是如此。请看一下这个