__super

本文介绍了C++中的__super关键字,该关键字用于显式调用基类中的被重写函数。通过示例代码展示了如何在多继承场景中使用__super来解决函数重载的问题,以及编译器如何自动匹配正确的基类方法。

对于__super关键字,MSDN中是这样描述的:

__super

Microsoft 专用

允许您显式,指出您调用您要重写的函数的一个基类的实现。

__super::member_function();

备注

在重载决策阶段,任何可访问的基类方法,考虑,并提供最佳匹配的函数是调用的脚本。


__super 可以在成员函数体内仅显示。


使用声明,__super 不能与一起使用时。 有关更多信息,请参见使用声明。


插入代码 属性 的介绍,代码可能包含名称不可能知道,但请包含方法要调用的一个或多个基类。


示例

// deriv_super.cpp
// compile with: /c
struct B1 {
   void mf(int) {}
};

struct B2 {
   void mf(short) {}

   void mf(char) {}
};

struct D : B1, B2 {
   void mf(short) {
      __super::mf(1);   // Calls B1::mf(int)
      __super::mf('s');   // Calls B2::mf(char)
   }
};

杂谈

参考http://blog.youkuaiyun.com/peterpan19890802/article/details/5459631的博客,__super可以描述为某个基类的代替符,具体是哪个基类无需自己操心,只要不存在接口定义冲突(多继承情况下,不同基类定义的相同接口),编译器会自动完成基类的匹配过程。若冲突,编译器会报错(此处未测试),可根据报错信息修改~

其实这个__super关键字我本不知道,还是参考OC中的super关键字,打出来后,在VC助手提示下发现的,百度了下才知道意思……

<think> 我们正在讨论的是Python中的`__class__`和`super()`,以及它们之间的关系。根据引用[1],在Python3中,`super()`的实现依赖于一个名为`__class__`的变量,这个变量在方法定义时被隐式地创建,它指向的是定义该方法的类。 在Python中,`super()`函数用于调用父类(超类)的方法。这在继承中非常有用,尤其是当子类重写了父类的方法,但还想调用父类的实现时。 引用[1]提到,`super()`会从调用栈中查找`__class__`这个名字。实际上,在方法定义时,`__class__`是一个自由变量,它会被闭包捕获,指向定义该方法的类。 关于`class __super__`,在Python中并没有直接名为`__super__`的内置类或属性。可能用户是混淆了`super()`和`__class__`,或者是指某些特定框架中的用法。在Python中,我们通常使用`super()`来获取一个代理对象,该对象会按照方法解析顺序(MRO)来调用父类的方法。 下面是一个简单的示例,说明如何使用`super()`: ```python class Parent: def __init__(self): print("Parent __init__") class Child(Parent): def __init__(self): super().__init__() # 调用父类的__init__方法 print("Child __init__") c = Child() ``` 输出: ``` Parent __init__ Child __init__ ``` 在这个例子中,`Child`类继承自`Parent`类。在`Child`的`__init__`方法中,我们使用`super().__init__()`来调用`Parent`的`__init__`方法。 另外,引用[1]提到,可以直接使用`__class__`,例如: ```python class Child(Parent): def __init__(self): # 使用__class__和super()的等价形式 super(__class__, self).__init__() print("Child __init__") ``` 这种形式中,`super(__class__, self)`显式地指定了类和实例。在Python3中,通常可以省略参数,因为解释器会自动填充,但在一些复杂情况下(比如多重继承)可能需要显式指定。 需要注意的是,在类方法(`@classmethod`)中,`super()`的行为类似,但会绑定到类而不是实例。例如: ```python class Parent: @classmethod def class_method(cls): print("Parent class method") class Child(Parent): @classmethod def class_method(cls): super().class_method() # 调用父类的类方法 print("Child class method") Child.class_method() ``` 输出: ``` Parent class method Child class method ``` 总结: - `__class__`是一个在方法定义时自动创建的变量,指向定义该方法的类。 - `super()`函数用于调用父类的方法,它依赖于`__class__`和当前的实例(或类,如果是类方法的话)。 - 在Python3中,通常可以无参数使用`super()`,即`super()`,解释器会自动填充为`super(__class__, self)`(在实例方法中)或`super(__class__, cls)`(在类方法中)。 关于用户提到的`class __super__`,可能是一个误解。在Python中,没有直接名为`__super__`的内置类。`super()`返回的是一个`super`对象,它是一个代理对象,用于委托方法调用。 如果用户是在其他上下文中(比如某个特定的框架)看到`__super__`,那可能是框架自己定义的。但在标准的Python中,不存在这样的名字。 因此,我们重点解释`super()`和`__class__`的关系和用法。 §§相关问题§§ 1. 在多重继承中,`super()`是如何工作的? 2. 在Python2和Python3中,`super()`的使用有什么不同? 3. 如何理解方法解析顺序(MRO)? 4. 在静态方法中可以使用`super()`吗? </think>### `__class__`和`super()`的概念及用法 在Python中,`__class__`和`super()`是与类继承和方法调用相关的关键概念,主要用于在子类中访问父类的属性和方法。 #### 1. `__class__`的含义 `__class__`是一个**隐式闭包变量**,在类方法定义时自动创建: - 指向**当前方法被定义的类**(不是调用时的类) - 在方法内部可直接访问:`__class__` - 常用于与`super()`配合调用父类方法 示例: ```python class Parent: def show(self): print("Parent method") class Child(Parent): def show(self): print("Child method") # __class__指向Child,即使通过子类实例调用 print("Defined in:", __class__.__name__) # 输出:Child ``` #### 2. `super()`的工作原理 `super()`返回父类的**代理对象**,用于调用父类方法: - **单参数形式**:`super(__class__, self)`(显式指定类) - **零参数形式**:`super()`(Python 3+ 推荐用法) - 通过MRO(方法解析顺序)确定调用顺序 ```python class Parent: def run(self): print("Parent running") class Child(Parent): def run(self): super().run() # 调用父类方法 print("Child running") obj = Child() obj.run() ``` 输出: ``` Parent running Child running ``` #### 3. 关键配合用法 在子类方法中组合使用`__class__`和`super()`: ```python class Parent: def process(self): print("Parent processing") class Child(Parent): def process(self): # 显式调用父类方法 super(__class__, self).process() print("Child processing") ``` > 引用[1]指出:`super`的实现依赖`__class__`变量,它会从调用栈中查找该方法被定义的类[^1]。 #### 4. 与iOS的对比 引用[2]提到iOS中的`[super class]`机制: - Objective-C通过`objc_msgSendSuper`结构体实现父类调用 - Python的`super()`是动态代理,而iOS是静态编译确定 - Python的`__class__`类似于Objective-C的`self->isa`指针[^2] #### 5. 最佳实践 1. **Python 3+** 优先使用零参数形式 `super()` 2. 需要明确指定类时使用 `super(__class__, self)` 3. 避免在类外部直接使用 `__class__` 4. 多重继承时注意MRO顺序(`类名.mro()`查看)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值