加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

如何在C模板子类中部分重载虚函数?

发布时间:2020-12-16 09:59:55 所属栏目:百科 来源:网络整理
导读:我正在尝试创建一个非模板基类来创建一个接口,通过该接口我可以与派生的模板类进行交互.我希望使用部分虚函数重载,但有些东西不起作用,我不知道为什么. 任何人都可以解释为什么我下面的代码返回: B match = FalseD match = TrueE match = False 而不是B,D返
我正在尝试创建一个非模板基类来创建一个接口,通过该接口我可以与派生的模板类进行交互.我希望使用部分虚函数重载,但有些东西不起作用,我不知道为什么.
任何人都可以解释为什么我下面的代码返回:

B match = False
D match = True
E match = False

而不是B,D返回True,E返回False?我原以为派生类中的重载运算符会拾取指向int’& i’并被调用,但事实并非如此.

为了清楚起见,我不是试图 – 覆盖 – 匹配的基本版本,我正在尝试-overload-它,特别希望它有一个不同的,在这种情况下比Base中的那个更专业的接口,使用其功能签名时接管.

我也试图避免为我可能实例化的Derived模板的每种风格扩展Base类.

更奇怪的是,我 – 可能 – 只是在这里疯了,但我发誓这在不久前的某个时刻对我有用! Fwiw我在OSX 10.5上,使用llvm 7.0.0和clang 700.1.76.这可能是编译器的特性吗?

虽然我在这里尝试(不成功)使用部分重载,但我真的愿意采用任何方法来解决通过其参数类型选择模板实例函数的问题,而不会增加类,if-thens / case或者添加特定的Base类的特化.如果您有其他方法可以用于类似功能,我很乐意听到它.

感谢您提供的任何见解!

#include <stdio.h>

class Base
{
public:
  Base() {}
  virtual ~Base(){}

  virtual bool match( const void *data ) const { return false; }
};

template <class Type>
class Derived: public Base
{
public:
  Derived():Base() {}
  ~Derived() override{}

  virtual bool match( const Type *data ) const { return true; }
};

int main(int argc,char **argv)
{
  Derived<int>   *d = new Derived<int>();
  Derived<float> *e = new Derived<float>();
  Base *b           = d;

  int i;
  printf("B match = %sn",b->match(&i)?"True":"False");
  printf("D match = %sn",d->match(&i)?"True":"False");
  printf("E match = %sn",e->match(&i)?"True":"False");

}

解决方法

如果您要手动创建Derived< int>作为一个类,它的成员函数是:

virtual bool match( const int *data ) const { return true; }

它不会覆盖基类.因此,当您使用基类指针调用该函数时,它会执行基类实现,当您使用派生类指针调用它时,它会执行派生类实现.

如果使用override关键字,则可以在编译时捕获问题.

template <class Type>
class Derived: public Base
{
public:
  Derived():Base() {}
  ~Derived() override{}

  virtual bool match( const Type *data ) const override { return true; }
};

您应该看到该更改的编译时错误.

请参阅http://ideone.com/8rBQ6B中的编译器错误.

更新,以回应OP的评论

如果你不是要覆盖:

>不要在成员函数声明中使用virtual.
>通过使用将基类函数放入派生类的范围

using Base::match

这是怎么做的:

template <class Type>
class Derived: public Base
{
public:
  Derived():Base() {}
  ~Derived() override{}

  using Base::match;
  bool match( const Type *data ) const { return true; }
};

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读