我理解非虚方法是静态绑定的,这意味着,据我所知,它在编译时就知道哪个方法将在哪个对象上调用.该决定基于对象的静态类型.令我困惑的是接口(而不是类)和静态绑定.
考虑一下这段代码
public interface IA
{
void f();
}
public class A : IA
{
public void f() { Console.WriteLine("A.f()"); }
}
public class B : A
{
public new void f() { Console.WriteLine("B.f()"); }
}
B b = new B();
b.f(); //calls B.f() //Line 1
IA ia = b as IA;
ia.f(); //calls A.f() //Line 2
Run Code Online (Sandbox Code Playgroud)
演示代码:http://ideone.com/JOVmi
我明白了Line 1.编译器可以知道b.f()将调用,B.f()因为它知道静态类型b …
我最初担心发布这个问题以免重复。但即使在谷歌搜索了许多关键字后,我也找不到任何解释 C 的静态和动态绑定的 StackOverflow 链接。虽然有 C++ 的问题和答案,但是所有涉及的classes东西显然不适合 C。StackExchange 之外的链接非常可疑。
我需要知道这两个绑定之间的严格定义和对比,仅在 CI 的上下文中,如果您能花一些时间来回答它,或者给我 StackOverflow 上的链接,以免我弄错并已得到解答,我将不胜感激之前详细说。
我打算清楚地了解:
编辑如果您能用一些简单的代码片段来解释差异,那将非常有帮助。
我想获得在子类中重新声明的静态var的值:
class A {
private static $echo_var = 'PARENT_ECHO' ;
public static function e() {
return '$echo_var = ' . self::$echo_var ;
}
}
class B extends A {
private static $echo_var = 'CHILD_ECHO';
}
echo B::e();
Run Code Online (Sandbox Code Playgroud)
我想得到CHILD_ECHO.
谢谢,Mottenmann
以前我能做到这样的事情
<OnPlatform x:TypeArguments="Color" Android="{StaticResource Primary}"/>
Run Code Online (Sandbox Code Playgroud)
现在,该语法已被弃用,我正在尝试这样做:
<OnPlatform x:TypeArguments="Color">
<On Platform="Android">{StaticResource Primary}</On>
</OnPlatform>
Run Code Online (Sandbox Code Playgroud)
但我收到以下错误:
Cannot convert "{StaticResource Primary}" into Xamarin.Forms.Color
Run Code Online (Sandbox Code Playgroud)
我的语法应该如何?
有人可以解释为什么i->value()和(i + 1)->value()打印1和3不是1和4喜欢 x[0]->value() << x[1]->value()
#include <iostream>
#include <vector>
class A
{
public:
A(int n = 0) : m_n(n) { }
public:
virtual int value() const { return m_n; }
virtual ~A() { }
protected:
int m_n;
};
class B
: public A
{
public:
B(int n = 0) : A(n) { }
public:
virtual int value() const { return m_n + 1; }
};
int main()
{
const A a(1); //a.m_n=1
const B b(3); …Run Code Online (Sandbox Code Playgroud)