C++虚函数

来源:互联网 发布:王洛宾与三毛 知乎 编辑:程序博客网 时间:2024/06/06 02:54

1. 子类在构造时调用基类的构造函数

#include<iostream>using namespace std;class base{public:base(){cout<<"Base Constract"<<endl;}virtual void fun(){cout<<"Base call"<<endl;}virtual void anfun(){cout<<"Base another call"<<endl;}};class derive: public base{public:derive(){cout<<"Derive Constract"<<endl;}void fun(){cout<<"Derive call"<<endl;}};int main(){derive *b = new derive();//b->fun();//b->anfun();return 0;}

析构函数不是这样的,如果基类的析构函数是非虚的,则析构时只掉用基类的虚析构函数,这样会产生析构的问题,如下面这个代码:

#include<iostream>using namespace std;class A{public:    A() { ptra_ = new char[10];}    ~A() { delete[] ptra_;}        private:    char * ptra_;};class B: public A{public:    B() { ptrb_ = new char[20];}    ~B() { delete[] ptrb_;}private:    char * ptrb_;};void foo(){    A * a = new B;    delete a;}


2. 基类指针构造的子类对象,如果积累函数不是虚函数,则调用基类函数,不调用子类函数。

#include<iostream>using namespace std;class base{public:base(){cout<<"Base Constract"<<endl;}void fun(){cout<<"Base call"<<endl;}virtual void anfun(){cout<<"Base another call"<<endl;}};class derive: public base{public:derive(){cout<<"Derive Constract"<<endl;}void fun(){cout<<"Derive call"<<endl;}};int main(){base *b = new derive();b->fun();//b->anfun();return 0;}

3. 子类函数的指针新建的子类对象,调用函数先调用子类函数,如果子类没有,调用基类函数

#include<iostream>using namespace std;class base{public:base(){cout<<"Base Constract"<<endl;}void fun(){cout<<"Base call"<<endl;}virtual void anfun(){cout<<"Base another call"<<endl;}};class derive: public base{public:derive(){cout<<"Derive Constract"<<endl;}void fun(){cout<<"Derive call"<<endl;}};int main(){derive *b = new derive();b->fun();b->anfun();return 0;}


原创粉丝点击