Kur*_*son 17 c++ virtual inheritance function
我有一种情况,似乎编译器没有找到与另一个成员函数同名的虚函数的基类定义/实现.
struct One {};
struct Two {};
struct Base
{
virtual void func( One & );
virtual void func( Two & ) = 0;
};
struct Derived : public Base
{
virtual void func( Two & );
};
void Base::func( One & )
{}
void Derived::func( Two & )
{}
// elsewhere
void this_fails_to_compile()
{
One one;
Derived d;
d.func( one );
}
Run Code Online (Sandbox Code Playgroud)
我正在使用Visual C++ 2008.错误消息是:
错误C2664:'Derived :: func':无法将参数1从'One'转换为'Two&'
我原以为基于类型的调度可以工作并调用定义的基类函数.如果我添加一个Derived::func( One & )
它确实编译并被正确调用,但在我的情况下,该函数的版本可以在基类中完成,通常派生类本身不需要实现它.我目前正在通过在基类中放置一个不同名称的非虚函数来解决它,该函数将调用转发给导致问题的函数:
// not virtual, although I don't think that matters
void Base::work_around( One & one )
{
func( one );
}
Run Code Online (Sandbox Code Playgroud)
这有效,但显然不太理想.
我遗漏了哪些继承和/或名称隐藏规则?
Dav*_*eas 18
您正在将方法隐藏在派生类中.最简单的解决方案是向派生类添加using声明.
struct Derived : public Base
{
using Base::func;
virtual void func( Two & );
};
Run Code Online (Sandbox Code Playgroud)
问题是,当编译器尝试func
在调用中查找标识符时,d.func(one)
它必须从Derived
上向上执行该操作,但它将在找到func
标识符的第一个上下文中停止,在这种情况下它是Derived::func
.没有进一步的查找,编译器只看到了Derived::func( Two& )
.
通过添加using Base::func;
指令,当编译器看到Derived
定义时,它会将所有Base::func
声明带入作用域,并且会发现存在Base::func( One & )
未被覆盖的声明Derived
.
另请注意,如果您通过引用调用Base
,则编译器将找到两个重载,func
并将适当地分配给最终的覆盖器.
Derived d;
Base & b = d;
b.func( one ); // ok even without the 'using Base::func;' directive
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
3965 次 |
最近记录: |