【问题标题】:Pass derived object to function and access overridden member function将派生对象传递给函数并访问覆盖的成员函数
【发布时间】:2021-08-03 19:54:12
【问题描述】:

我正在尝试将一个指向该类从另一个类继承的对象的指针传递给一个函数,然后访问它的成员函数。

这是基类:

class Base
{
public:
  virtual int funcA(int paramA) = 0;
}

这是派生类:

class Derived : public Base
{
public:
  Derived();
  ~Derived();
  int funcA(int paramA);
}

Derived::Derived() {}
Derived::~Derived() {}
Derived::funcA(int paramA)
{
  // SOMETHING
}

函数应该是这样的:

template<class T> // T should only be types that are derived from Base
void funcB(T* object)
{
  object.funcA(10);
}

我已经尝试了很多不同的东西,但都没有编译,因为我正在尝试访问模板的函数。

【问题讨论】:

  • "我已经尝试了很多不同的方法,但没有一个奏效" 请定义您所说的“没有一个奏效”。
  • 没有编译这些东西,因为我试图访问模板的特定功能
  • 使用std::enable_if
  • 它是object-&gt;funcA(10),因为你有一个指针。你写了一个点,它不会编译。基础/派生问题与此无关。

标签: c++ templates inheritance


【解决方案1】:

首先Derived::funcA(int paramA) 的定义缺少返回参数int 并且有一个返回类型int 它必须返回一些东西,例如paramA。为了清楚起见,您要覆盖Base 类的功能,我还将funcA 标记为overridefinal。 其次,通过传递指向funcB 的指针,您必须使用箭头运算符-&gt; 而不是点运算符. 来访问成员函数。实现这一点的最简洁方法是仅当模板参数T 继承自Base 时才使用SFINAE (std::enable_id) 激活函数。对于 C++17,这看起来像

template<class T>
std::enable_if_t<std::is_base_of_v<Base, T>, void>
funcB(T* object) {
  object->funcA(10);
  return;
}

对于 C++11 类似

template<class T>
typename std::enable_if<std::is_base_of<Base, T>::value, void>::type
funcB(T* object) {
  object->funcA(10);
  return;
}

应该做的工作。 Try it here.

【讨论】:

  • 这也适用于成员函数吗?
  • @MQwadezo 使用 MSVC 会收到什么错误消息?
  • 问题不是msvc,问题是在我的真实代码中,funcB是一个成员函数
  • 我明白了。 funcB 不应该是一个问题,它也是一个成员函数。您收到什么样的错误消息?
  • 我不知道这个错误到底是怎么回事,错误代码是LNK2019
猜你喜欢
  • 1970-01-01
  • 2013-12-26
  • 1970-01-01
  • 2011-04-21
  • 1970-01-01
  • 1970-01-01
  • 2019-09-27
  • 2015-08-20
  • 1970-01-01
相关资源
最近更新 更多