【问题标题】:Calling an overloaded parent's method from a child class in C++从 C++ 中的子类调用重载的父类方法
【发布时间】:2019-03-19 14:25:17
【问题描述】:

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

基本上我有以下代码:

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()

有没有一种简单的方法可以在不引入开销的情况下获得“child doFoo”作为输出?

【问题讨论】:

  • 不清楚您所说的“类似技术”是什么意思。您可以使用 [静态 |动态]_cast,例如。
  • 好的,我会摆脱这个要求。除了引入开销的选项之外,每个选项都可以。实际上,它并不是很清楚。
  • 您已经在使用 CRTP 关键字。您在实施时遇到困难吗?
  • 我想知道是否有其他方法可以做到这一点,或者 CRTP 是否是唯一的解决方案。我认为也有不同的实现方式
  • 我认为还有其他解决方案。但是 CRTP 有什么问题呢?

标签: c++ templates inheritance crtp overload-resolution


【解决方案1】:

我不知道这是否是一个选项,但如果你能负担得起模板类而不是方法,你可以让“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()
}

【讨论】:

  • 有趣的解决方案,感谢分享。事实是它使用 virtual 关键字,我想避免任何开销
  • 请定义“开销”的含义。此外,你想要没有 virtual 关键字的多态性,这甚至没有意义。
  • 阿图尔:en.wikipedia.org/wiki/…。只需谷歌虚拟 C++ 开销即可理解我的意思
  • @Saturnu 我相信上述多态性可以在编译时确定并遵循与 CRTP 相同的想法,考虑到这一点,使用您提供的维基百科链接,我们有:但是,在许多情况下,所需的多态行为是不变的,可以在编译时确定。然后可以使用奇怪循环模板模式 (CRTP) 来实现静态多态性,这是对编程代码中多态性的模仿,但在编译时解决,因此消除了运行时虚拟表查找。
  • 我想你没看懂我刚才说的,编译时就确定了,即使是 virtual 关键字。请看看这个example
猜你喜欢
  • 2016-02-14
  • 1970-01-01
  • 2012-01-21
  • 2020-01-14
  • 1970-01-01
  • 2015-10-11
  • 2010-12-05
  • 2020-04-26
  • 2017-11-09
相关资源
最近更新 更多