永发信息网

关于虚函数静态绑定的问题...

答案:2  悬赏:0  手机版
解决时间 2021-03-07 00:43
  • 提问者网友:难遇难求
  • 2021-03-06 17:27
class A
{ public:
A() { f();} //构造函数不动态绑定
~A() { ...... }
virtual void f();
void g(); //非虚拟函数不动态绑定
void h() { f(); g(); }
};
class B: public A
{ public:
~B() { ...... }
void f();
void g();
};

void main()
{
cout<<"for a:"< A a; //调用A::A(),A::f
a.f(); //调用A::f
a.g(); //调用A::g
a.h(); //调用A::h、A::f和A::g
cout<<"for b:"< B b; //调用B::B(), A::A()和A::f
b.f(); //调用B::f
b.g(); //调用B::g
b.h(); //调用A::h、B::f和A::g

}

不明白
.b.h(); //调用A::h、B::f和A::g 为什么不是A::f...b又不是指针或者引用....为什么会采取动态绑定?
最佳答案
  • 五星知识达人网友:持酒劝斜阳
  • 2021-03-06 18:19
参考答案 吃饭不嚼不知味,读书不想不知意。
全部回答
  • 1楼网友:煞尾
  • 2021-03-06 19:08
java与c++的差别1. java中boolean类型和int类型不兼容,即不能互相转换,而且boolean型的true和fasle是不能比大小的;c++中true == 1; false == 0; (true > flase) == 1;2. java中char型是16位的,即两个字节;而c++中的char型是1一个字节即8位的。3. java中表达式中char、byte、short类型计算时会自动先转换成int型,即两个byte型相加生成的是int型变量。有以下定义byte b1 = 1,b2 = 2,b3;要将b3赋值成b1和b2的和,必须写成b3 = (byte)(b1 + b2);因为b1+b2是int型的,不强制转换类型编译器会报错。而c中则不会将char、byte、short类型自动转换成int型。4. java中常数(即字面值)中,整数是默认int型的,小数是默认double型的。char、byte、short变量可以直接赋值成整数,不改变类型,而long变量赋值时要加上后缀l,float变量赋值小数时要加上后缀f(float赋值不加后缀会报错)。例如long t1 = 20l;float f1 = 2.3f;c++中的类型转换则不是很严格;5. java中控制语句的表达式必须是boolean型的,不能是int型的,因为两者不兼容;c++则两者都可;6. java中没有指针,申明数组时有type name[];其中[]里面不能填数字。name有length成员表示数组的大小;c++中数组[]可以填数字进去,一般类型的数组没有length成员。java中可以初始化如type name[] = ;其中简单类型的数组(例如int)可以在{}中直接赋值。c++中简单类型的java中多维数组以二位数组int型为例,int a[][] = new int [2][],即第二维可以先不申明,然后可以申明不规则数组,即a[0] = new int[1]; a[1] = new int[2]; a[3] = new int [3];c++中高维数组无法动态分配,只能静态分配,因此也无法实现不规则数组7. java中继承类中的方法重写时相当于c++中的虚函数,java中的abstract方法相当于c++中的纯虚函数,java中含有abstract方法的类必须申明为abstract类,即类前要加上abstract修饰语,此时这个类无法被实例化,而且生成的子类必须重写超类(即父类)的abstract方法,否则子类也不能被实例化,并且要显示地申明为abstract类。c++中不用修饰抽象类。8. java中有超类的引用变量可以引用子类的实例,相当于c++基类的指针可以指向派生类的实例。类似的,超类的引用虽然指向了子类,但是在子类中有的成员或者方法却在超类中没有时,超类的引用仍然无法使用。在c++也是如此,使用基类指针生成派生类的对象,但是这个指针指向的成员必须是基类拥有的。9. java中string(申明类型时注意s大写)的两个变量str1、str2如果相等,是意味着它们引用的同一个字符串(相当于用同一个内存),若要表示独立的两个变量所含的字符串相同,则string类有方法boolean equals(string str)可以调用。即如果str1.equeals(str)的值为true,则str1与str2所含的字符串相等。string还有一些其他方法:boolean equals(string str) 如果调用字符串包含的字符序列与str一样,则返回true,int length() 获取字符串的长度char charat(int index) 获取index指定的索引位置的字符int compareto(string str) 调用字符串小于str,则返回小于0的数;大于返回大于0的数;相等则返回0int indexof(string str) 返回调用字符串中第一个与str匹配的索引,没有匹配则返回-1int lastindexof(string str) 返回调用字符串中最后一个与str匹配的索引,没有匹配则返回-1c++中如果str1 == str2值为1,则表示str1的字符串与str2的字符串相等,两者可以独立
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯