【问题标题】:Why can't we call virtual function in base class using object of base class in case the virtual function is not overridden in child class?如果虚函数在子类中没有被覆盖,为什么我们不能使用基类的对象在基类中调用虚函数?
【发布时间】:2014-12-01 11:13:35
【问题描述】:

我有一个示例代码sn-p:

class A
{
public:
    virtual void func1();
    virtual void func2();
};
class B
{
public:
    virtual void func2();
    virtual void func3();
};

void main()
{
    A *obj = new B;
    obj->func3();  
}

为什么obj->func3(); 行返回错误?
(我们知道为每个类创建了一个单独的虚拟表)”

【问题讨论】:

  • 你需要使用继承。
  • 应该AB 的公共基础吗?
  • 另外,请记住main 的返回类型是int
  • 您的问题标题难以阅读,请考虑将其缩短。另外,请更具体地说明错误。
  • 怀疑 obj 是否能够指向虚拟表。但它甚至无法编译,因为 A 类中不存在 func。感谢您的回答。

标签: c++ polymorphism virtual-functions overriding


【解决方案1】:

因为obj 是指向A 的指针。 A 上面没有func3,所以不能调用它。

注意:我假设您实际上想从 A 继承 B - 它会在调用之前出错,在当前状态下分配。

【讨论】:

    【解决方案2】:

    这不可能奏效。考虑:

    Class B : public A
    {
        void Foo (int);
    };
    
    class C : public A
    {
        void Foo (char);
    };
    
    class D : public A
    {
        void Foo (double);
    }
    
    void bar (A* obj)
    {
       obj->Foo (1); // Uh oh!
    }
    

    编译器如何知道要生成什么代码?这应该传递一个整数吗?浮标?一个角色?

    而且它永远不安全,因为编译器在编译 bar 之类的函数时无法看到所有派生类的定义。

    如果你想通过指向基类的指针来调用一个函数,基类至少需要定义这个函数需要什么参数。

    【讨论】:

      【解决方案3】:

      如果需要工作,您的代码应如下所示。您需要在基类中声明函数,否则在 func3() 的 vtable 中它的空间不会在基类中分配。

      class A
      {
      public:
      virtual void func1();
      virtual void func2();
      virtual void func3();  //virtual function , linking at run time depends on what object it points to 
      };
      class B : public A   //public inheritance
      {
      public:
      virtual void func2();
      virtual void func3(); 
      };
      
      void main()
      {
      A *obj = new B;  //base class pointer pointing to derived class object
      obj->func3();  //since func3() is declared as virtual  , dynamic linking takes place and since at 
                      // run times it points to object b , function in class B is invoked
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-08-16
        • 1970-01-01
        • 2010-10-14
        • 2017-09-22
        • 2015-11-04
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多