C++ 在模板虚拟类层次结构中调用基类方法
假设我有以下类层次结构:C++ 在模板虚拟类层次结构中调用基类方法,c++,templates,virtual,C++,Templates,Virtual,假设我有以下类层次结构: template< class T > class TestBase { public: virtual T const & do_foo() = 0; }; template< class T > class TestDerived : public virtual TestBase< T > { public: virtual int do_bar() { return do_f
template< class T >
class TestBase {
public:
virtual T const & do_foo() = 0;
};
template< class T >
class TestDerived : public virtual TestBase< T > {
public:
virtual int do_bar() {
return do_foo() + 1;
}
};
现在,如果我将其更改为从已知类型实例化的TestBase派生(例如,类TestDerived:public virtual TestBase
,此代码段编译得很好,因此问题显然与编译时未知的基类类型有关。但由于我没有在任何地方实例化任何一个类的对象,我不明白为什么这会有问题
基本上,我如何在不诉诸-fppermissive
的情况下解决错误?非依赖名称(即不依赖于模板参数的名称),在解析模板时查找,而不是在实例化模板时查找。您需要将do\u foo
设置为从属名称。基本上有两种方法可以实现此目的:
virtual int do_bar() {
return this->do_foo() + 1;
}
或
模板
类TestDerived:公共虚拟测试库{
公众:
使用TestBase::do_foo;
虚拟int do_bar(){
返回do_foo()+1;
}
};
它不会因为它的美丽而赢得任何奖项,但是这段代码按照预期工作,没有编译器的抱怨
virtual int do_bar() {
return ((TestBase<T> *) this)->do_foo() + 1;
}
virtualint do_bar(){
返回((TestBase*)this)->do_foo()+1;
}
在TestDerived
中是否应该是virtual t do_bar()
?@BartekBanachewicz-我不认为这是必要的,t可以是任何类型,例如decltype(do_foo()+1)
是一个int(或者我认为可以隐式转换为int)。哦,好的。它当然会触发实例化。还有第三种方法:显式限定名称,而不是通过使用@KonradRudolph导入名称,这会改变语义。如果使用我列出的方法之一,则使用动态分派(虚拟调用)正常工作。如果您明确符合条件,动态调度将被忽略。您不需要强制转换。仅使用此->
也可以工作。事实上,我尝试此操作时肯定出了其他问题!您的答案更完整;投了赞成票!谢谢。作为记录,我没有对您投反对票(您的答案本身没有错)。
template< class T >
class TestDerived : public virtual TestBase< T > {
public:
using TestBase<T>::do_foo;
virtual int do_bar() {
return do_foo() + 1;
}
};
virtual int do_bar() {
return ((TestBase<T> *) this)->do_foo() + 1;
}