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

    
    
  • 相关阅读:
    合并表已经转化对象的操作
    终于也有自己的博客园一角了,权当新人报到帖了
    常见软件滤波器总结
    按键设计总结
    关于goto语句
    Delphi XE2 Default Keyboard Shortcuts
    Delphi XE2 IDE Classic Keyboard Shortcuts
    Delphi实现静态变量
    datasnap传输流/文件问题
    查询条件的封装(小结)
  • 原文地址:https://www.cnblogs.com/softidea/p/4859776.html
Copyright © 2011-2022 走看看