c++ - 继承困惑

标签 c++ inheritance

好吧,我一直在研究游戏引擎,但遇到了一个问题......目前我有一个类层次结构(图像->动画->对象),所有这些类都有一个方法get_type() 我遇到了这个问题:

如果我使用 new 关键字或静态声明一个派生类,我会得到想要的结果:

object instance;
cout << instance.get_type(); //returns an int value  

object* pointer = new(object);
cout << pointer->get_type();

从上面的代码中,控制台输出3。该方法在对象中声明为:

图像类:

class image{
public:
  virtual int get_type();
};

int object::get_type(){
  return 1;
}

动画类:

class animation: public image{
public:
  virtual int get_type();
};

int animation::get_type(){
  return 2;
}

项目等级:

class object: public animation{
public:
  virtual int get_type();
};

int object::get_type(){
  return 3;
}

现在当我做这样的事情时,问题就出现了:

object* t = &object();
cout << t->get_type();  

现在结果是 1。

如果我从 object 类的类声明中删除 virtual 关键字,它会按预期工作(代码的最后一位返回 3)

问题:如何在不使用 new 关键字的情况下使用对象* 指针中的虚拟方法?原因是,我用指向这些对象的指针填充一个 vector ,并在添加它们时创建它们,所以我希望能够执行如下操作:

vector<object*> objects; //not imgs or animations
for (int a = 0; a < 20; a++){
  objects.push_back(&object());
}

并且有任何对象[x]->get_type();返回正确的类类型。原因是我在我的游戏中使用的事件系统需要起源类类型...

TLDR; 我真的很讨厌继承,你能帮忙吗?

最佳答案

这是因为构造函数和析构函数都已在您的代码中运行:

object* t = &object();
cout << t->get_type(); 

&object() 创建一个(匿名的,临时的)对象,立即销毁它(因为它是临时的),然后将现在销毁的对象的地址分配给 t。 (如果您将警告级别调得足够高,您的编译器可能会警告您有关此表达式的信息。)

尝试创建一个在您使用它的过程中一直存在的对象:

object my_object();
object *t = &my_object;
cout << t->get_type();

当您使用非虚函数时,指针 t 的类型在编译时用于确定调用哪个方法。当您使用虚函数时,对象内部的信息在运行时在虚拟分派(dispatch)期间用于决定调用哪个函数。由于您的对象在调用时未正确构造(因为它已经被破坏),结果严格未定义但最终调用了错误的函数。

关于c++ - 继承困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7170710/

相关文章:

c++ - unicode 或任何其他编码数据如何存储在内存中? (win32)

c++如何创建相互依赖的类

c++ - Eclipse 找不到我的 C/C++ MinGW 工具链

c++ - 将使用太多纹理插值器 - 带旋转的着色器

Java 继承和 super() 未按预期工作

c++ - 如何将 printf 输出重定向回代码?

python - Python中的Lookup Chain和MRO有什么关系?

java - 理解Java中的继承和抽象类

java - 静态嵌套类可以通过非静态扩展

Java抽象类和泛型