当我从基础构造函数调用虚函数时,编译器不会给出任何错误.但是当我从基类构造函数调用纯虚函数时,它会产生编译错误.
考虑下面的示例程序:
#include <iostream>
using namespace std;
class base
{
public:
void virtual virtualfunc() = 0;
//void virtual virtualfunc();
base()
{
virtualfunc();
}
};
void base::virtualfunc()
{
cout << " pvf in base class\n";
}
class derived : public base
{
public:
void virtualfunc()
{
cout << "vf in derived class\n";
}
};
int main()
{
derived d;
base *bptr = &d;
bptr->virtualfunc();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这里可以看出纯虚函数有一个定义.我期望在bptr->virtualfunc()执行时调用基类中定义的纯虚函数.相反,它给出了编译错误:
错误:从构造函数调用的抽象虚拟`virtual void base :: virtualfunc()'
这是什么原因?
c++ constructor virtual-functions compiler-errors dynamic-binding
我知道Objective-C对所有方法调用都使用动态绑定.这是如何实现的?在编译之前,objective-c"变成C代码"并且只使用(void*)指针来处理所有内容吗?
我刚刚阅读了关于我现在在stackoverflow中询问的相同主题的所有搜索结果,并没有真正回答我的好奇心.但这就是事情.
问题
1.)据我所知,静态绑定意味着它在编译期间设置,并且它在运行时存在,而动态绑定意味着它在运行时设置.
2.)所以我读过的书介绍了动态数组,它提到动态数组大小可以在运行时设置.这是以这种方式完成的.
代码
int size;
cin >> size;
int * pz = new int [size]; // dynamic binding, size set at run time
delete [] pz; // free memory when finished
Run Code Online (Sandbox Code Playgroud)
3.)在这段代码中,书中提到动态数组大小可以在运行期间设置.出于好奇,我试试这个.
代码
int size;
cin >> size;
int array[size];
//After the array declaraction i assign value to it to check whether it works or not.
Run Code Online (Sandbox Code Playgroud)
4.)上面的代码也有效,所以我只是好奇动态数组有什么特别之处,因为普通静态数组可以做同样的工作.
5.)是因为动态数组可以在运行时释放它的内存而静态不能使它如此特殊吗?
感谢您花时间阅读我的问题,请指出我所犯的任何错误.
我的问题:通过ajax加载一些元素后,我绑定了一些点击功能,但是当用户加载几次相同的元素时,绑定动作将重复(不替换,至少看起来像).我尝试过unbind,click(function(){return false;});但是完全从元素中移除了clic动作......).这种问题的标准解决方案是什么?
在询问有关反思的问题时,我问:
很好的答案.但说
myobject.foo()和之间有区别x = getattr(myobject, "foo"); x();.即使它只是化妆品.在第一个中,foo()是静态编译的.在第二种情况下,字符串可以通过多种方式生成. - 乔1小时前
得到了答案:
呃,马铃薯/马铃薯...在python中,niether是静态编译的,所以它们或多或少相当. - SWeko 1小时前
我知道Python对象的成员存储在字典中,并且一切都是动态的,但我假设给出了以下代码:
class Thing():
def m(self):
pass
t = Thing()
Run Code Online (Sandbox Code Playgroud)
生成.pyc时,以下代码会以某种方式静态编译:
t.m()
Run Code Online (Sandbox Code Playgroud)
即编译器知道地址m(),因此在运行时没有点绑定.那个或运行时会缓存后续查找.
虽然这总是涉及到字典:
meth = getattr(t, "m")
meth()
Run Code Online (Sandbox Code Playgroud)
是否所有调用都被视为字典中的字符串查找?或者这两个例子实际上是相同的吗?
我刚开始学习Objective-C,我读的Objective-C的第三版编程由斯蒂芬·G·库奇.
有一段解释多态性机制:
在运行时,Objective-C运行时系统将检查存储在dataValue1(id对象)中的对象的实际类,并从正确的类中选择适当的方法来执行.但是,在更一般的情况下,编译器可能会生成错误的代码以将参数传递给方法或处理其返回值.如果一个方法将一个对象作为其参数而另一个方法采用浮点值,则会发生这种情况.例.或者,例如,如果一个方法返回一个对象而另一个方法返回一个整数.如果两个方法之间的不一致只是一个不同类型的对象(例如,Fraction的add:方法将Fraction对象作为其参数并返回一个,而Complex的add:方法接受并返回一个Complex对象),编译器将仍然生成正确的代码,因为无论如何内存地址(即指针)都作为对象的引用传递.
我不太明白段落的第一部分说如果我在具有相同名称和不同类型参数的不同类中声明2个方法,编译器可能会生成错误的代码.虽然段落的最后一部分说有两个方法具有相同的名称和不同的参数并且返回类型是好的...哦不...
我有以下代码,他们编译并运行正常:
@implementation A
- (int) add:(int)a {
return 1 + a;
}
@end
@implementation B
- (int) add: (B*) b {
return 100;
}
@end
id a = [[A alloc] init];
id b = [[B alloc] init];
NSLog(@"A: %i, B %i", [a add:100], [b add:b]);
Run Code Online (Sandbox Code Playgroud)
编辑:正如我引用的文本,上面的代码应该会导致错误,但它只会产生一些警告消息,找到名为"add:"的多个方法,不兼容指向整数转换的指针,将"id"发送到类型为"int"的参数
我有Java和C++背景,我知道Objective-C中的多态性与那些语言略有不同,但我仍然对不确定性感到困惑(粗体文本).
我想我一定是误解了一些东西,请你详细解释一下Objective-C中的动态绑定对于我和那些需要它的人吗?
谢谢!
假设我有这三个类:
class Foo {
void fn() {
System.out.println("fn in Foo");
}
}
class Mid extends Foo {
void fn() {
System.out.println("fn in Mid");
}
}
class Bar extends Mid {
void fn() {
System.out.println("fn in Bar");
}
void gn() {
Foo f = (Foo) this;
f.fn();
}
}
public class Trial {
public static void main(String[] args) throws Exception {
Bar b = new Bar();
b.gn();
}
}
Run Code Online (Sandbox Code Playgroud)
是否有可能调用Foo的fn()?我知道我的解决方案gn()不起作用,因为this它指向一个类型的对象Bar.
诚实地说,我不确定我是否完全理解"动态"与"词汇"的约束意味着什么.但据我所知,当我使用defvar或defparameter定义绑定时,1.它声明了一个全局变量2.绑定被声明为"特殊",因此它可以被新的本地绑定所遮蔽,例如
(defvar *x* 3)
(defun f () *x*)
(f) ;=>3
(let ((*x* 2)) (f));=>2
Run Code Online (Sandbox Code Playgroud)
现在,我的问题是,是否有可能具有相同属性的局部绑定(即不污染全局环境的绑定)(即可以被"外部"/"更新"绑定遮蔽)?
例:
(special-binding ((x 1)) (defun f () x))
(f);=>1
x;=>error, no binding in the global environment
(let ((x 2)) (f));=>2
Run Code Online (Sandbox Code Playgroud)
我尝试(special x)在let块中使用声明,或者(locally (declare (special x)) ...),但它似乎没有创建闭包(要求从定义的函数中的变量值触发"未绑定变量"错误).
在下面的c ++代码中使用虚函数
#include<iostream>
using namespace std;
class Base{
public:
virtual void fun(){
cout << "Base::fun()called \n";
}
};
class Child : public Base {
public:
void fun() {
cout << "Child::fun() called\n";
}
void door(){
cout << "Child::door() called \n";
}
};
int main(){
Base *base_ptr = new Child();
base_ptr->fun();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
如何使用base_ptr调用门功能?在一次采访中询问了这个问题.我想知道它是否可能
谢谢你的回复
dynamic-binding ×10
c++ ×4
objective-c ×2
arrays ×1
binding ×1
closures ×1
common-lisp ×1
constructor ×1
cpython ×1
inheritance ×1
java ×1
jquery ×1
polymorphism ×1
python ×1
rtti ×1