我有一个示例代码段:
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();
会返回错误?
(我们知道为每个类创建了一个单独的虚拟表)"
答案 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
}