s****n 发帖数: 1237 | 1 下面这段代码输出的是 Class B func1 x = 2, 我有几个疑问
1. 为啥调用的是B的func1但是x却是用了A的缺省值?
2. B的func1我特地设为private,为啥还是能调用?我试过直接B ojbB,就不能用ojbB
.func1();
3. 这里面涉及哪些相关的知识点,有什么好的quick tutorial可以推荐。
谢谢。
#include
using namespace std;
class A
{public:
virtual void func1 (int x = 2) {
cout << "Class A func1 x = " << x << "\n";
}
};
class B: public A
{private:
virtual void func1 (int x = 8){
cout <<"Class B func1 x = " << x << "\n";
}
};
void main () {
A *aPtr = new B;
aPtr -> func |
p****o 发帖数: 1340 | 2 1. values of default arguments are resolved at compilation time
2. a function is virtual is virtual, and the "private" clause only
constraints the use of class B outside B.
kind of feeling strange at first, and it makes sense eventually.
ojbB
【在 s****n 的大作中提到】 : 下面这段代码输出的是 Class B func1 x = 2, 我有几个疑问 : 1. 为啥调用的是B的func1但是x却是用了A的缺省值? : 2. B的func1我特地设为private,为啥还是能调用?我试过直接B ojbB,就不能用ojbB : .func1(); : 3. 这里面涉及哪些相关的知识点,有什么好的quick tutorial可以推荐。 : 谢谢。 : #include : using namespace std; : class A : {public:
|
I*****y 发帖数: 602 | 3 补充一下,由于1的原因,虚函数在不同的类里面,需要保持相同的默认参数,最好不
要使用默认参数。
2. access修饰符只针对静态类型,你的例子里面调用虚函数的时候,实际看的是A的修
饰符,与B无关。
说到底,默认参数和访问修饰符看的是静态类型,与动态类型无关。
【在 p****o 的大作中提到】 : 1. values of default arguments are resolved at compilation time : 2. a function is virtual is virtual, and the "private" clause only : constraints the use of class B outside B. : kind of feeling strange at first, and it makes sense eventually. : : ojbB
|
s****n 发帖数: 1237 | 4 也就是说default parameter和accessible是static typing,
只有function actual body才是dynamic binding的?
【在 I*****y 的大作中提到】 : 补充一下,由于1的原因,虚函数在不同的类里面,需要保持相同的默认参数,最好不 : 要使用默认参数。 : 2. access修饰符只针对静态类型,你的例子里面调用虚函数的时候,实际看的是A的修 : 饰符,与B无关。 : 说到底,默认参数和访问修饰符看的是静态类型,与动态类型无关。
|
t****t 发帖数: 6806 | 5 对, 楼上说的很好. 就是static binding和dynamic binding的区别.
只有函数地址本身是dynamic binding的. 其它都是static. 为什么? 因为只有函数地
址是通过vtable查的, 别的都是编译时决定的.
ojbB
【在 s****n 的大作中提到】 : 下面这段代码输出的是 Class B func1 x = 2, 我有几个疑问 : 1. 为啥调用的是B的func1但是x却是用了A的缺省值? : 2. B的func1我特地设为private,为啥还是能调用?我试过直接B ojbB,就不能用ojbB : .func1(); : 3. 这里面涉及哪些相关的知识点,有什么好的quick tutorial可以推荐。 : 谢谢。 : #include : using namespace std; : class A : {public:
|
t****t 发帖数: 6806 | 6 我为什么要重复一遍你说的话...
【在 s****n 的大作中提到】 : 也就是说default parameter和accessible是static typing, : 只有function actual body才是dynamic binding的?
|
s****n 发帖数: 1237 | 7 能帮我巩固几遍,呵呵。
发现从来不编程要pick up c++还真不容易。
【在 t****t 的大作中提到】 : 我为什么要重复一遍你说的话...
|