zoukankan      html  css  js  c++  java
  • 类(class)能不能自己继承自己(转)

    类(class)能不能自己继承自己
    不行,继承关系会出现环。

    假设类A继承类A。
    那么要新建一个类A的对象,就必须先建立一个类A父类的对象。这是一个递归的过程,而且没有终止条件。会死循环的。

    从编译的角度讲,声明类A的时候需要用到它的父类,但是此时类A还没有声明。所以是不可行的。

    === 犹豫了一下的分割线 ===
    评论区有同学说了模版这种妖术可以解决。我仔细想了想,貌似还真有编程语言可以实现。
    比如在Lua中一种常见的继承方式是使用metaclass。此时只要将metaclass指向自己就好了。此时的继承关系依旧是个环…区别在此处的环形继承关系是在运行时的时候创建的,所以可以硬上,之前的是要求运行前就搞定的,所以在创建的时候会有问题…此时的继承关系不影响你使用:P。同理其他的像JS啊之类的东东也可以有类似的用法。然而并没有什么卵用……

    严格意义上的继承不可能实现,否则将会出现循环依赖.若分离内存布局的"继承",则可以通过CRTP继承包含自身类型信息的基类;如@白如冰 的答案里提到的;(这应该说是更像将自身的类型信息"传递"给了基类,也算是一种非严格意义另类的自身继承_(:3」∠)_ ).
    这种"继承"自身还是有需求的,基于性能的考虑;主要是通过CRTP可实现静态多态:
    在编译期确定函数的调用省去了虚表
    Demo:

    #include <iostream>
    
    template<class _Ty>
    class Base
    {
    public:
        void func()    //call the function implemented in derived class
        {
            static_cast<_Ty*>(this)->func();    
        }
    };
    
    class Derived_A
        :public Base<Derived_A>
    {
    public:
        void func()    //implement
        {
            std::cout << "Derived Class A" << std::endl;
        }
    };
    
    class Derived_B
        :public Base<Derived_B>
    {
    public:
        void func()    //implement
        {
            std::cout << "Derived Class B" << std::endl;
        }
    };
    
    template<class _Ty>
    void invoke(Base<_Ty>& obj)
    {
        obj.func();
    }
    
    int main()
    {
        Derived_A A;
        Derived_B B;
        invoke(A);
        //Output: Derived Class A
        invoke(B);
        //Output: Derived Class B
        return 0;
    }

    因为继承关系是非对称(反对称且非自反)的。

    http://www.zhihu.com/question/31848825

    
    
  • 相关阅读:
    octotree神器 For Github and GitLab 火狐插件
    实用篇如何使用github(本地、远程)满足基本需求
    PPA(Personal Package Archives)简介、兴起、使用
    Sourse Insight使用过程中的常使用功能简介
    Sourse Insight使用教程及常见的问题解决办法
    github 遇到Permanently added the RSA host key for IP address '192.30.252.128' to the list of known hosts问题解决
    二叉查找树的C语言实现(一)
    初识内核链表
    container_of 和 offsetof 宏详解
    用双向链表实现一个栈
  • 原文地址:https://www.cnblogs.com/softidea/p/4859776.html
Copyright © 2011-2022 走看看