gpt4 book ai didi

c++ - 多态指针

转载 作者:太空宇宙 更新时间:2023-11-04 15:12:57 25 4
gpt4 key购买 nike

我正在努力解决 C++ 中的多态性问题。我有 2 个类,HeroMainPlayerHero 是基类,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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com