类(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

				
时间: 2024-12-27 12:35:51

类(class)能不能自己继承自己(转)的相关文章

基类与接口混合继承的声明问题

1. 问题初现 今天,查看<接口继承的声明问题>一文的反馈,发现Ninputer留下这样一道题: 如果有 class A : Interface1 那么 class B : A, Inteface1 和 class B : A 会出现什么不同的情况呢.编译器在IL级别是用什么手段实现这个功能的呢? 2. 探索问题 & 理解问题 解决问题的过程既是一个探索的过程也是一个推理论证的过程.OK,下面我尝试用反证法来探索这个问题. 首先,我假设问题中B类的两种继承方式有着一样的效果,并试着寻找

php类的扩展和继承用法实例

  本文实例讲述了php类的扩展和继承用法.分享给大家供大家参考.具体如下: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 <?php class Thread { var $topic; //帖子主题 var $body; //

Python类的定义、继承及类对象使用方法简明教程

  这篇文章主要介绍了Python类的定义.继承及类对象使用方法简明教程,本文用浅显易懂的语言讲解了类的定义.继承及类对象的使用,非常实用易懂,需要的朋友可以参考下 Python编程中类的概念可以比作是某种类型集合的描述,如"人类"可以被看作一个类,然后用人类这个类定义出每个具体的人--你.我.他等作为其对象.类还拥有属性和功能,属性即类本身的一些特性,如人类有名字.身高和体重等属性,而具体值则会根据每个人的不同;功能则是类所能实现的行为,如人类拥有吃饭.走路和睡觉等功能.具体的形式如

解决友元类(friend class)无法继承的问题

解决友元类(friend class)无法继承的问题   友元声明friend class是无法继承的.举例说明:class A声明class B为其友元类,也就是说class A授予class B访问class A的所有包括私有成员在内的所有成员.如果class C 继承class B.那么class C是不具备这种特权的.     但是如果我想在class C中访问class A的某个私有或者保护成员函数怎么办? 我们可以把工作交给父类.   #include <iostream> usi

php类的定义与继承用法实例_php技巧

本文实例讲述了php类的定义与继承用法.分享给大家供大家参考.具体如下: <?php /* * class */ class people { public $name; public $age; function __construct($namec,$agec) { $this->name = $namec; $this->age = $agec; } protected function getmessage() { return "姓名:".$this->

php函数、类和对象以及类的封装、继承、类的静态方法、静态属性

原文:php函数.类和对象以及类的封装.继承.类的静态方法.静态属性 1.函数     php内置函数可以直接使用,如果没有安装php扩展即可     自定义函数 //函数function 函数名 function dump($var = null){ //支出默认参数值 echo '<pre/>'; var_dump($var); } 2.类(class)和对象( new Obj) <?php //定义一个人的类,现在还不是对象 class Person { //私有属性 privat

默认构造函数-类构造函数的问题(继承)

问题描述 类构造函数的问题(继承) #include <iostream> using namespace std; class People { protected: char name[20],xb[10],id[21]; int num,all,week; public:People() { } public:People(char na[20],int nu,char x[10],char idc[21],int al,int wk) { strcpy_s(name,na); num=

qt-自己定义的类MyItem控件继承于QGraphicsWidgt类,该如何布局求例子。

问题描述 自己定义的类MyItem控件继承于QGraphicsWidgt类,该如何布局求例子. 自己写了一个myItem:QGraphicsWidgetd的控件,现在想在main.cpp中完成布局,布局的样式就是顶部一个MyItem控件,下面是垂直分布的.两边可以添加控件这种样式 求大神讲解下 阿里嘎多.目前自己研究的是利用了QGraphicsLinearLayout. 解决方案 http://www.it165.net/pro/html/201308/6703.html

dynamic- Dynamic_cast C++类与对象问题 继承和多态问题,求大神修改

问题描述 Dynamic_cast C++类与对象问题 继承和多态问题,求大神修改 Dynamic_cast Total: 65 Accepted: 22 Time Limit: 1sec Memory Limit:256MB Description Three classes A, B and C are shown below: class A { public: virtual ~A() {}; }; class B: public A {}; class C: public B {};