• C++多态小结


    示例

    class test1
    {
    public:
    	virtual void proc1();
    	void proc();
    };
    
    class test2:public test1
    {
    public:
    	virtual void proc1();
    };
    
    void test1::proc1()
    {
    	cout<<"1";
    
    }
    
    void test1::proc()
    {
    	proc1();
    }
    
    void test2::proc1()
    {
    	cout<<"2";
    }
    

    定义了test1和test2两个类,其中test2为test1的子类。其中两个类中都有虚函数Proc1,子类test1还有个成员函数Proc,此成员函数会调用虚函数Proc1。

    test2 A;
    A.proc();
    

    实例化一个test2类对象,然后调用test1的成员函数proc。由于c++多态的作用实际proc函数调用的是test2的Proc1。因为其是通过虚拟指针查表得到的proc1函数的地址,所以是多态。

    误解

    误认为只有通过指针和引用调用虚函数时才会形成多态,实际这句话是相对于通过类对象实例直接调用虚函数而言的。

    test2 A;
    A.Proc1();
    //上述代码是通过类实例直接调用虚函数,所以编译器直接编译为直接调用的形式
    
    test2* p;
    p->Proc1();
    //上述代码是通过指针调用的虚函数,所以编译器将其编译为通过虚表指针查表得方式得到函数地址,然后再调用。
    

    实际除了通过类对象实例直接调用虚函数之外(再构造/析构函数中调用虚函数也不会形成多态),其他形式调用虚函数都会形成多态。

  • 相关阅读:
    leetcode 78. 子集 JAVA
    leetcode 91. 解码方法 JAVA
    leetcode 75. 颜色分类 JAVA
    leetcode 74 搜索二维矩阵 java
    leetcode 84. 柱状图中最大的矩形 JAVA
    last occurance
    first occurance
    classical binary search
    LC.234.Palindrome Linked List
    LC.142. Linked List Cycle II
  • 原文地址:https://www.cnblogs.com/revercc/p/15549981.html
Copyright © 2020-2023  润新知