zoukankan      html  css  js  c++  java
  • 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();
    //上述代码是通过指针调用的虚函数,所以编译器将其编译为通过虚表指针查表得方式得到函数地址,然后再调用。
    

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

  • 相关阅读:
    读写锁机制原理
    jvm
    (WPF) 再议binding:点击User Control时,User Control变换颜色或做其他的处理。
    (WF)
    (C# ) 解析XML。
    (C#) 调用执行批处理文件
    (WPF, Service) 删除注册表中的USB Enum值.
    (C#) 文件操作
    (C#) Parse xml 时, 返回的node值总是null。
    (PowerShell) Managing Windows Registry
  • 原文地址:https://www.cnblogs.com/revercc/p/15549981.html
Copyright © 2011-2022 走看看