空类有哪些成员函数
- 缺省构造函数
- 缺省拷贝构造函数
- 缺省析构函数
- 缺省赋值运算符
- 缺省取地址运算符
- 缺省取地址运算符const
- *注:只有当实际使用这些函数的时候,编译器才会去定义它们。
class Empty { public: Empty(); // 缺省构造函数 Empty(const Empty&); // 拷贝构造函数 ~Empty(); // 析构函数 Empty& operator=(const Empty&); // 赋值运算符 Empty* operator&(); // 取值运算符 const Empty* operator&() const; // 取值运算符 };
C++多态的实现
C++的多态分为静态多态和动态多态,静态多态是通过重载和函数模版来实现的,动态多态是通过虚函数和继承关系来实现的
- 函数重载发生在同一个类中,参数个数或者类型不同算重载(只有返回值不同的不算重载!!)
void test(int arg){}
void test(char arg){}
void test(int arg1, int arg2){}
- 函数模版, 函数的参数未指定
template < typename T>
T getMax(T arg1, T arg2)
{
return arg1 > arg2 ? arg1:arg2;
} - 虚函数和继承
先说说派生类和基类之间的特殊关系,基类指针可以在不进行显式类型转换的情况下指向派生类对象;基类引用可以在不进行显式类型转换的情况下引用派生类对象。反过来是不行的。derived s(); base* obj = &s; base& obj = s;
当我们希望同一个方法在基类和派生类中的行为是不同的时候,多态就通过虚函数体现出来了。
- 如果类定义了虚函数,创建对象时,则会分配内存空间,并且为该父类以及其所有子类的内存空间上额外分配一个虚函数表.
- 虚函数表的作用在于,存储每个类的相同的虚函数名,然后每一次虚函数调用,都会去虚函数表查找地址
注意,当把构造函数定义为虚函数时会报错,假如构造函数是虚函数的话,由于对象开始还未分配内存空间,所以根本就无法找到虚函数表,从而构造函数也无法被调用.所以构造函数是不能成为虚函数.
析构函数可以为虚函数, 析构函数设置为虚函数可以保证正确的析构函数序列被调用,我们释放其基类对象时,能使整个类(包括派生类)对象完全释放,如果析构函数只是普通函数,则不能析构完全。
-
#include <iostream> using namespace std; class base { int a, b; public: void virtual test() { cout << "基类方法!"<<endl; } virtual ~base(){cout<<"基类析构"<<endl;} }; class inheriter:public base{ public: void virtual test(){cout<<"派生类方法!"<<endl;} virtual ~inheriter(){cout<<"派生类析构"<<endl;} }; int main(){ base *b = new inheriter(); b -> test(); delete b; return 0; }
#output
派生类方法!
派生类析构
基类析构