• 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
      派生类方法!
      派生类析构
      基类析构

  • 相关阅读:
    C# 16 进制字符串转 int
    C# 16 进制字符串转 int
    dotnet 设计规范 · 抽象定义
    dotnet 设计规范 · 抽象定义
    C# 从零开始写 SharpDx 应用 控制台创建 Sharpdx 窗口
    C# 从零开始写 SharpDx 应用 控制台创建 Sharpdx 窗口
    C# 判断两条直线距离
    C# 判断两条直线距离
    PHP file() 函数
    PHP fgetss() 函数
  • 原文地址:https://www.cnblogs.com/Dancing-Fairy/p/15244554.html
Copyright © 2020-2023  润新知