C++基类与派生类的函数调用情况
2014-04-17 11:26
218 查看
在定义了基类的指针与派生类的对象,或者是派生类指针与基类的对象。
在函数调用的时候,如果该函数在基类中被定义为虚函数,那么在调用的时候看该指针(包括基类指针和派生类指针)所指向的对象,如果是派生类的对象就调用派生类中重写的函数,如果是基类的对象就调用基类中的函数。如果该函数为非虚函数,那么看该指针的类型,如果是基类的指针就调用基类中的函数,如果是派生类的指针就调用派生类中的函数。这种情况是非多态的情况,函数没有实现重写,而只是进行了覆盖。
在定义了基类的指针与派生类的对象,或者是派生类指针与基类的对象。
在函数调用的时候,如果该函数在基类中被定义为虚函数,那么在调用的时候看该指针(包括基类指针和派生类指针)所指向的对象,如果是派生类的对象就调用派生类中重写的函数,如果是基类的对象就调用基类中的函数。如果该函数为非虚函数,那么看该指针的类型,如果是基类的指针就调用基类中的函数,如果是派生类的指针就调用派生类中的函数。这种情况是非多态的情况,函数没有实现重写,而只是进行了覆盖。
#include "iostream" using namespace std; #include<iostream> using namespace std; class Base { public: virtual void f(float x) { cout<<"Base::f(float)"<< x <<endl; } void g(float x) { cout<<"Base::g(float)"<< x <<endl; } }; class Derived : public Base { public: virtual void f(float x) { cout<<"Derived::f(float)"<< x <<endl; //多态、覆盖 } void g(int x) { cout<<"Derived::g(int)"<< x <<endl; //隐藏 } }; int main(void) { //定义子类的对象 Derived d; // 基类的指针指向子类对象 Base *pb = &d; //子类指针指向子类对象 Derived *pd = &d; //虚函数,是调用所指向对象的函数 pb->f(3.14f); // Derived::f(float) 3.14 pd->f(3.14f); // Derived::f(float) 3.14 // 非虚函数,根据指针属于基类或子类调用 pb->g(3.14f); // Base::g(float) 3.14 pd->g(3.14f); // Derived::g(int) 3 Base a;//定义基类的对象 Derived *ptr = (Derived *)&a;//子类的指针 ptr->f(3.14f); // Base::f(float) 3.14 ptr->g(3.14f); // Derived::g(int) 3 return 0; }
相关文章推荐
- C++基类与派生类的函数调用情况
- [疑问]C/C++中为什么在类外利用多态基类指向派生类指针可以调用类的私有成员函数?
- C++如何在派生类成员函数内调用基类的成员函数(包括构造函数)
- C/C++中为什么在类外利用多态基类指向派生类指针可以调用类的私有成员函数?
- 多态继承情况下,有一个基类指针指向派生类对象,如何用它调用基类的虚函数?
- C++派生类函数调用基类的函数
- C++中通过派生类调用第二基类的普通成员函数时this指针的调整
- 虚函数调用时一点注意,调用基类函数时调用派生类函数
- 虚析构函数(删除基类对象时,先调用派生类的虚构函数,再调用基类虚析构函数)
- C++基类、派生类构造函数调用顺序
- C++继承类和基类之间成员函数和虚函数调用机制
- C++ 基类和派生类之间构造函数的调用
- 派生类和基类的函数调用
- C++ primer 这本书上有这么两句话“派生类虚函数调用基类版本时,必须显式使用作用域操作符。如果派生类函数忽略了这样做,则函数调用会在运行时确定并且将是一个自身调用,从而导致无穷递归。”
- C++中使用基类指针调用派生类中定义的方法
- C++:派生类的默认构造函数和拷贝构造函数调用基类构造函数的机制(含程序验证)
- !!!!!!!!!!!!!!!!C++:派生类中重定义基类的成员函数与虚函数区别在哪里?
- C++调用成员函数需要this指针的情况
- 关于基类构造函数调用虚函数实际调用的不是派生类的问题的原因
- C++调用一个成员函数的需求this指针的情况