• 重读深度探索C++对象模型:虚函数


    1.单一继承下的虚函数(待更新)

    2.多重继承下的虚函数

    多重继承讲给虚函数带来很大的问题,主要有三点:

    1.虚析构函数:

      析构函数一般都是虚函数,不然删除某个指向派生类的基类指针将不会析构派生类的内容。

    首先关于多重继承:

    如以下这个关系:

    A与B同级,C分别继承这两个类。

    如果A* a=new C;

    B* b=new C;

    则通过a只能调用displayA();

    通过b只能调用displayB();

    也就是说b->displayA()这样是非法的。

    然后是关于多重继承对虚析构函数的影响。

    现在A是基类中最左边的类,如果我们

    A* a=new C;

    现在a指向的实际上是现在这个对象地址的最起始处,而如果我们

    B* b=new C;

    现在b指向的起始是类中B subobject处,也就是说使用B类作为基类指针的话指向的不是起始处。

    但是当我们调用析构函数时,比如delete b时,此时应该将b再调整至类的起始地址处

    在单一继承时候是不存在这个问题的,因为只有一个基类,指针也一直指向类的起始地址,而当加入多重继承且经由非最左边的类的指针来delete时,需要在delete前将指针在调整至类的起始处,因为一开始b并不是指向起始,而是指向B subobject处的。

    class A
    {
    public:
    	virtual ~A()
    	{
    		cout<<"a bybye"<<endl;
    	}
    	virtual void displayA()
    	{
    		cout<<"a"<<endl;
    	}
    };
    class B
    {
    public:
    	virtual ~B()
    	{
    		cout<<"b byebye"<<endl;
    	}
    	virtual void displayB()
    	{
    		cout<<"b"<<endl;
    	}
    };
    class C:public A,public B
    {
    public:
    	~C()
    	{
    		cout<<"c bye bye"<<endl;
    	}
    };
    

      

  • 相关阅读:
    同时实现打开两个文件的内容
    《APUE》第四章笔记(4)
    《APUE》第四章笔记(3)
    《APUE》第四章笔记(2)
    《APUE》第四章笔记(1)
    约瑟夫环问题(报数问题)
    无符号十进制整数转换成任意进制数
    《APUE》第三章笔记(4)及习题3-2
    Edit Distance问题在两种编程范式下的求解
    Boyer and Moore Fast majority vote algorithm(快速选举算法)
  • 原文地址:https://www.cnblogs.com/lxy-xf/p/11378929.html
Copyright © 2020-2023  润新知