为什么我们不能在基类的对象中调用虚函数,以防在子类中没有重写虚函数?

时间:2014-12-01 11:13:36

标签: c++ polymorphism virtual-functions function-overriding

我有一个示例代码段:

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();会返回错误?
(我们知道为每个类创建了一个单独的虚拟表)"

3 个答案:

答案 0 :(得分:2)

因为obj是指向A的指针。 A上没有func3,因此您无法调用它。

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

答案 1 :(得分: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等函数时无法看到所有派生类的定义。

如果要通过指向基类的指针调用函数,基类需要至少定义函数所采用的参数。

答案 2 :(得分:0)

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

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
}