基指针中的派生对象如何调用基函数
How derived object in base pointer invokes base function?
如何保持基指针派生对象仍然指向基函数?Here After
a_ptr = &b_obj;
a_ptr->disp();
如果基函数是虚函数,我理解v表的作用,它保存着基函数的地址。但是这里基指针处理派生对象可以设法调用基函数。
有谁能解释一下幕后发生了什么吗?
class A
{
public:
//virtual void disp()
void disp()
{ cout<< "From class An" << endl; }
};
class B : public A
{
public:
void disp()
{ cout << "From Class Bn" <<endl; }
};
int main()
{
A a_obj;
A *a_ptr;
B b_obj;
a_ptr = &a_obj;
a_ptr->disp();
a_ptr = &b_obj;
a_ptr->disp();
}
基指针总是指向派生的对象的基部分。它不知道任何关于派生对象成员/方法的信息。
如果将方法A::disp()
声明为virtual
,那么在运行时只有它会被解析。它可以根据a_ptr
指向的对象调用A::disp()
或B::disp()
。
简单来说,
- 如果你声明了一个方法
virtual
,那么编译器知道这个方法必须在运行时求值。此外,该方法必须使用指针或引用来调用。 - 如果该方法是使用对象调用的,或者该方法不是使用对象调用的然后,
virtual
编译器会直接调用的方法呼叫方静态类型
在您的示例中,调用方的静态类型是A*
,而方法不是virtual
。因此编译器会直接调用A::disp()
;它不会等待运行时评估。
a_ptr = &b_obj; // static type --> typeof(*a_ptr) --> A
// dynamic type --> typeof(b_obj) --> B
a_ptr->disp(); // (is A::disp() virtual)?
// chooses B::disp() at runtime : chooses A::disp() at compiletime;
B::disp()
作为virtual
,并保持A::disp()
正常方法,那么您仍然会得到与现在相同的结果。]
相关文章:
- 使用基类指针调用基类的值构造函数的语法是什么?
- 调用原子的 store() 时可以调用基类型类的函数吗?C++
- 在初始化列表之外手动调用基类的构造函数
- 在基类中调用的 VIrtual 基函数,C++
- 在成员构造函数之后调用基类构造函数
- 如何使基类从子类调用覆盖函数
- 从带有参数的基函数指针调用基方法
- 如何在具有相同函数名称的派生类中调用基类的函数
- 有没有办法在C++中调用基类的所有子类函数?
- 调用基函数时模板参数推导失败
- 添加字符串类型的类成员会导致调用基类函数而不是子函数
- 有没有办法调用基类函数,该函数在使用私有继承的派生类中被覆盖?
- 如何在C++中调用基类虚函数
- 从基类数组调用派生函数
- 调用基类函数时强制使用类名?
- 从派生类调用基函数时会发生什么情况
- C++ 调用覆盖函数会导致调用基函数
- 从派生类函数调用基函数
- 基指针中的派生对象如何调用基函数
- 基函数中的公共函数,当使用派生对象通过另一个基函数调用时,派生调用基函数