- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在努力解决 C++ 中的多态性问题。我有 2 个类,Hero
和 MainPlayer
。 Hero
是基类,MainPlayer
派生自 Hero
。在 Hero
中我有一些变量和方法,而 MainPlayer
有一些额外的变量和方法。我正在尝试像这样创建多态指针:
Hero *player = new MainPlayer(constructor);
然后对于播放器,我只能访问 Hero
类中的方法,否则会出现编译错误。我想问一下是否可以通过此多态指针使用 MainPlayer
方法和变量:player
。
我的代码:
class Hero
{
public:
Hero();
virtual void fun() = 0;
private:
int a, b;
};
class MainPlayer:
public Hero
{
public:
MainPlayer();
void fun();
void fun2();
private:
int c;
};
int main()
{
Hero *player = new MainPlayer(constructor);
player->fun(); // works
player->fun2(); //doesn't work
return 0;
}
最佳答案
从指向基类 Hero
的指针,您只能调用函数和访问 Hero
类的成员。
这有一个重要的异常(exception),即在派生类中重写的基类的虚函数(具有与派生类 MainPlayer
中描述的相同签名),它将调用派生类的实现(即使它不包含关键字 override
)。
最后一个从MainPlayer
创建的指向Hero
的指针,可以转换回MainPlayer
的指针,然后你可以调用函数和从 MainPlayer
访问成员,如下例所示:
Hero * h2 = new MainPlayer();
MainPlayer * h3 = dynamic_cast<MainPlayer*>(h2);
if (h3 != nullptr)
{
h3->fun2();
}
delete h2;
最后别忘了删除你分配的指针
编辑:
override
说明符虽然不是必需的,但可以帮助您确保确实覆盖了基类中的函数。如果基类没有声明具有相同签名的虚函数,程序将无法编译。这是此概念的一个简单示例:
struct A
{
virtual void foo();
void bar();
};
struct B : A
{
void foo() const override; // Error: B::foo does not override A::foo
// (signature mismatch)
void foo() override; // OK: B::foo overrides A::foo
void bar() override; // Error: A::bar is not virtual
};
关于c++ - 多态指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47186497/
我来自 Asp.Net 世界,试图理解 Angular State 的含义。 什么是 Angular 状态?它类似于Asp.Net中的ascx组件吗?是子页面吗?它类似于工作流程状态吗? 我听到很多人
我一直在寻找 3 态拨动开关,但运气不佳。 基本上我需要一个具有以下状态的开关: |开 |不适用 |关 | slider 默认从中间开始,一旦用户向左或向右滑动,就无法回到N/A(未回答)状态。 有人
我是一名优秀的程序员,十分优秀!