繁体   English   中英

在大多数派生类类型上未调用虚拟函数

[英]Virtual function not called on most derived class type

编辑已解决并重新发布为示例程序

情况如下:

类的层次结构:

class Base
{
public:
   virtual void output() = 0;
private:
   int a;
};

class Derived_1 : public Base
{
public:
   virtual void output()
   {
      cout << "Derived_1" << endl;
   }
};

class Derived_2 : public Derived_1
{
public:
   virtual void output()
   {
      cout << "Derived_2" << endl;
   }
};

实现:

Derived_2* obj = reinterpret_cast<Derived_2*>(new Derived_1());
obj->output();

这将输出“ Derived_1”而不是“ Derived_2”。 我确定这对大多数人来说并不是什么新鲜事,但这是我在应用程序中执行某些工厂功能时没有想到的事情。

编辑此答案是基于原始代码发布的。 在看到截断的示例按预期工作后,OP更新了代码示例。


您的代码并不完全正确,但是发生这种情况的最常见原因是,当您尝试覆盖并创建重载时,没有正确获得签名。 当您通过基类进行调用时,它仍将正确调用定义的基类。

签名中的所有内容都很重要-一个常见的错误是方法的恒定性是签名的一部分。

您正在分配Value_object_data对象,而不是Value_object_uint32 您将其强制转换为Value_object_uint32的事实并没有改变。 实际对象的虚拟表不知道Value_object_uint32 ; 在其虚拟函数表中(该表是在错误构建时构造的)在format指向Value_object_dataformat 指向实际对象的指针的强力武装无法解决这种情况。

给定层次结构中所有基类和继承类的构造函数都从最派生的根调用到根,每个类恰好调用一次。 这意味着,您不必显式调用基类构造函数。 它将被自动调用。 如果需要指定应使用几个基类构造函数中的哪个,则也可以这样做:

class Base
{
public:
    Base() {} // default constructor
    Base(int a) {}
};

class Derived
{
public:
    Derived() : Base()
    {
    }

    Derived(int a)
      : Base(a) // Select the Base ctor that takes an int, instead of the default
    {
    }
};

int main()
{
    Derived d1;    // Calls Derived() and Base() ctors in this order
    Derived d2(5); // Calls Derived(5) and Base(5) in this order
}

当然,不需要Derived(int a)构造函数来调用Base(int)构造函数。 在这种情况下,将自动调用Base()构造函数。

至少, new_VO_data()方法已损坏。 由于可变的虚拟表大小和可变的填充,它可能会起作用,也可能不会起作用,这在标准上是任意的,取决于编译器选项。 简而言之,行为是不确定的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM