gpt4 book ai didi

c++ - 对虚函数 C++ 感到困惑

转载 作者:太空狗 更新时间:2023-10-29 23:34:01 25 4
gpt4 key购买 nike

我是一个 c++ n00b,我不确定我是否找对了地方,但我对此感到困惑:

include <iostream>

using namespace std;

class Enemy
{
public:
void sayHere()
{
cout<<"Here"<<endl;
}
virtual void attack()
{
}
};

class Monster: public Enemy
{

public:
virtual void attack()
{
cout<<"RAWR"<<endl;
}

};

class Ninja: public Enemy
{

public:
virtual void attack()
{

cout<<"Hiya!"<<endl;
}
};

int main()
{
Ninja n;
Monster m;
Enemy enemies[2];
enemies[0] = m;
enemies[1] = n;

for(int i = 0; i<2; i++)
{
enemies[i].sayHere();
enemies[i].attack();//Will not be overriden
}
return 0;
}

我的问题是为什么不覆盖 Monster 或 Ninja 类中的 attack() 函数?任何帮助,甚至是链接,我们将不胜感激。

最佳答案

只是做:

Enemy* n = new Ninja();
Enemy* m = new Monster();

n->sayHere();
n->attack();
m->sayHere();
m->attack();

delete n;
delete m;

那应该如你所愿。您需要使用指针才能工作。原因在于动态绑定(bind)的工作方式。

Whenever a program has a C++ virtual function declared, a v-table is constructed for the class. The v-table consists of addresses to the virtual functions for classes and pointers to the functions from each of the objects of the derived class. Whenever there is a function call made to the c++ virtual function, the v-table is used to resolve to the function address. This is how the Dynamic binding happens during a virtual function call.

这个想法是,编译器根据对象的内存地址存储指向每个方法的指针。它需要指针来访问表并调用适当的函数指针。想一想如果你要写一个面向对象的C 版本,你会如何提供继承和多态这样的机制?当您以这种方式思考时,这是有道理的。

我刚读到您要从 JAVA 转过来。在 JAVA 中,你的大部分对象都存储在堆上。这一切都只是暗示。

JAVA 的

Enemy n = new Ninja();
n.attack();

大致相当于

Enemy* n = new Ninja();
n->attack();

在哪里。 JAVA 中的运算符更像是 C++ 中的 -> 运算符。在这两种情况下,n 都在堆上。 Java 只是对你隐藏了所有指针和内存管理的东西。这就是为什么您可以对动态绑定(bind)在 JAVA 和 C# 中的工作方式一无所知。

关于c++ - 对虚函数 C++ 感到困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6881167/

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