C++类相关问题(空类、多态、重载、继承)

空类有哪些成员函数

  • 缺省构造函数
  • 缺省拷贝构造函数
  • 缺省析构函数
  • 缺省赋值运算符
  • 缺省取地址运算符
  • 缺省取地址运算符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
    派生类方法!
    派生类析构
    基类析构

原文地址:https://www.cnblogs.com/Dancing-Fairy/p/15244554.html