Ue4类设置找不到基类

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Ue4类设置找不到基类相关的知识,希望对你有一定的参考价值。

参考技术A Ue4类设置找不到基类如下
一、可以通过直接修改"BP_FPPCharacter"的名字为“BP_Shooter”作为基类,然后新建一个"BP_FPPCharacter"继承自“BP_Shooter”。这种方法适用于各个类对"BP_FPPCharacter"依赖不多的情况。
二、创建一个“BP_Shooter”继承于“Character”类,然后修改"BP_FPPCharacter"的父类。1、这时“BP_Shooter”是一个空类,因此对"BP_FPPCharacter"不会造成任何影响。
2、把"BP_FPPCharacter"通用的属性和方法迁移到父类“BP_Shooter”中去。这个方法适用于已经有很多类对"BP_FPPCharacter"依赖的情况。

编译器找不到在基类中实现的虚函数

【中文标题】编译器找不到在基类中实现的虚函数【英文标题】:Virtual function implemented in base class not being found by compiler 【发布时间】:2011-04-10 08:13:33 【问题描述】:

我遇到一种情况,编译器似乎没有找到与另一个成员函数同名的虚函数的基类定义/实现。

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

我使用的是 Visual C++ 2008。错误信息是:

错误 C2664:“Derived::func”:无法将参数 1 从“一”转换为“二 &”

我原以为基于类型的调度会起作用并调用定义的基类函数。如果我添加一个Derived::func( One & ),它会编译并正确调用,但在我的情况下,该版本的函数可以在基类中完成,通常派生类不需要自己实现它。我目前正在通过在基类中放置一个不同名称的非虚拟函数来解决它,该函数将调用转发给导致问题的函数:

// not virtual, although I don't think that matters
void Base::work_around( One & one )

    func( one );

这可行,但显然不太理想。

我在这里缺少什么继承和/或名称隐藏规则?

【问题讨论】:

补充一下,g++也会产生类似的错误信息。 【参考方案1】:

您将方法隐藏在派生类中。最简单的解决方案是在派生类中添加 using 声明。

struct Derived : public Base

    using Base::func;
    virtual void func( Two & );
;

问题在于,当编译器尝试在调用 d.func(one) 中查找 func 标识符时,它必须从 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

【讨论】:

啊。我没有意识到它会在找到名称匹配后立即停止搜索,即使参数不匹配。感谢您快速而彻底的回答。 @Kurt:这是名称隐藏的问题。很烦人。【参考方案2】:

您将func(One&) 函数隐藏在Derived 中。您可以使用完全限定名称:

d.Base::func( one );

【讨论】:

一般来说,使用完全限定名称可能不是最好的主意。考虑是否将新的Derived2 类添加到将覆盖Base::func(One&) 的层次结构中。现在,如果通过引用 Derived 来持有 Derived2 的实例并与上面的代码一起使用,它将调用 Base::func(One&) 而不是最终的覆盖器 Derived2::func(One&) 我什至不知道您可以指定成员函数的限定名称!不过语法看起来很糟糕。

以上是关于Ue4类设置找不到基类的主要内容,如果未能解决你的问题,请参考以下文章

java 主启动类找不到

控制器类找不到 html 模板

php thinkphp vender第三方类找不到类怎么解决

Eclipse中HttpServlet类找不到

RegistryKey与RegistryValue类找不到问题处理

RegistryKey与RegistryValue类找不到问题处理