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;
}