我正在学习C++而我正在进入虚拟功能.
根据我的阅读(在书中和在线),虚函数是基类中的函数,您可以在派生类中重写它们.
但是在本书前面,当我学习基本继承时,我能够在不使用的情况下覆盖派生类中的基本函数virtual.
那我在这里错过了什么?我知道虚拟功能还有更多功能,而且它似乎很重要,所以我想清楚它究竟是什么.我在网上找不到直接答案.
最近我开始玩Python,我遇到了一些特殊的闭包方式.请考虑以下代码:
adders=[0,1,2,3]
for i in [0,1,2,3]:
adders[i]=lambda a: i+a
print adders[1](3)
Run Code Online (Sandbox Code Playgroud)
它构建了一个简单的函数数组,它接受单个输入并返回由数字添加的输入.函数在for循环中构造,迭代器i从中循环0到3.对于这些数字中的每一个,lambda都会创建一个函数i,该函数捕获并将其添加到函数的输入中.最后一行将第二个lambda函数3作为参数调用.令我惊讶的是输出结果是6.
我期待一个4.我的理由是:在Python中,一切都是一个对象,因此每个变量都是指向它的指针.在创建lambda闭包时i,我希望它存储一个指向当前指向的整数对象的指针i.这意味着当i分配一个新的整数对象时,它不应该影响先前创建的闭包.遗憾的是,adders在调试器中检查数组表明它确实存在.所有的lambda功能指的最后一个值i,3,这将导致adders[1](3)返回6.
这让我想知道以下内容:
lambda函数以更改其值i时不会受到影响的方式捕获当前i值?当我在调查Javascript代码中的词法闭包问题时,我在Python中遇到了这个问题:
flist = []
for i in xrange(3):
def func(x): return x * i
flist.append(func)
for f in flist:
print f(2)
Run Code Online (Sandbox Code Playgroud)
请注意,此示例谨慎避免lambda.它打印"4 4 4",这是令人惊讶的.我期待"0 2 4".
这个等效的Perl代码是正确的:
my @flist = ();
foreach my $i (0 .. 2)
{
push(@flist, sub {$i * $_[0]});
}
foreach my $f (@flist)
{
print $f->(2), "\n";
}
Run Code Online (Sandbox Code Playgroud)
打印"0 2 4".
你能解释一下这个区别吗?
更新:
这个问题是不是与i是全球性的.这显示相同的行为:
flist = []
def outer():
for i in xrange(3):
def inner(x): return x * i …Run Code Online (Sandbox Code Playgroud) 当我在C#中发生早期/晚期绑定时,我正试图解决这个问题.
非虚方法总是早期绑定.虚方法总是后期绑定:编译器插入额外的代码来解析在执行时绑定到的实际方法并检查类型安全性.因此,子类型多态性使用后期绑定.
使用反射调用方法是后期绑定的一个示例.我们编写代码来实现这一点,而不是编译器.(例如,调用COM组件.)
当Option Strict关闭时,VB.NET支持隐式后期绑定.当对象被赋值为声明为Object类型的变量时,该对象是后期绑定的.VB编译器在执行时插入代码以绑定到正确的方法并捕获无效的调用.C#不支持此功能.
我正朝着正确的方向前进吗?
如何调用委托并通过接口引用调用方法?是早期还是晚期绑定?
早期和晚期绑定在C++中是如何形成的?你举个例子吗?
我读到函数重载是早期绑定,虚函数是后期绑定.我读到 "早期(或静态)绑定是指编译时绑定,而后期(或动态)绑定是指运行时绑定".
我应该使用什么标准来决定是否像这样编写VBA代码:
Set xmlDocument = New MSXML2.DOMDocument
Run Code Online (Sandbox Code Playgroud)
或者像这样:
Set xmlDocument = CreateObject("MSXML2.DOMDocument")
Run Code Online (Sandbox Code Playgroud)
?
这似乎是发生在不同的情况下,过去的错误在这里,但我不能直接倾倒模式-我使用的是ModelCheckpoint回调.什么可能出错?
信息:
重现错误的最小示例:
from keras.layers import Input, Lambda, Dense
from keras.models import Model
from keras.callbacks import ModelCheckpoint
from keras.optimizers import Adam
import tensorflow as tf
import numpy as np
x = Input(shape=(30,3))
low = tf.constant(np.random.rand(30, 3).astype('float32'))
high = tf.constant(1 + np.random.rand(30, 3).astype('float32'))
clipped_out_position = Lambda(lambda x, low, high: tf.clip_by_value(x, low, high),
arguments={'low': low, 'high': high})(x)
model = Model(inputs=x, outputs=[clipped_out_position])
optimizer = Adam(lr=.1)
model.compile(optimizer=optimizer, loss="mean_squared_error")
checkpoint = ModelCheckpoint("debug.hdf", monitor="val_loss", verbose=1, save_best_only=True, mode="min")
training_callbacks = [checkpoint] …Run Code Online (Sandbox Code Playgroud) 在这个问题中,输出为Rose0.但是当我通过逻辑时,我觉得答案必须是Rose100而不是Rose0.编译器如何区分两个类中的is.由于Rosea延伸_39级,因此它也拥有超级I级.但是在第1行,如果我改变super.i然后我得到Rose100.这有何不同?
class _39 {
int i;
_39(){
i=100;
foo();
}
public void foo(){
System.out.println("Flower"+i);}
}
}
public class Rosea extends _39{
int i=200;
Rosea(){
i=300;
}
public void foo(){
System.out.println("Rose"+i);
} //line 1
public static void main(String[] args) {
new Rosea();
}
}
Run Code Online (Sandbox Code Playgroud) 我正在编写一些操作其他办公应用程序(办公室)的代码.当我编写代码时,我想让VBE帮助我处理属性和函数,就像链接到excel的那些一样.
这是怎么做到的?例如,当我输入word_doc并添加一个点后,我希望VBE给我"书签"作为下拉选项.就像我将word_doc设置为打开excel文件一样.
word_doc - >设置word_doc = word_app.documents.Open("C:\ Users\sjan\Desktop\MailingLetter.docx")