c**********e 发帖数: 2007 | 1 #include
using namespace std;
struct A {
virtual void invoke() { cout << "Goodbye!\n"; }
};
struct Invoker {
Invoker(A* a) { a->invoke(); }
};
class B : A, Invoker {
public:
B(): A(), Invoker(this) {}
void invoke() { cout << "Hello world!\n"; }
};
Referring to the code above, what happens when an instance of class B is
constructed?
a) "Hello world!" will be printed out on the console--followed by a newline.
b) "Goodbye!" will be printed out on the console--followed by a n | z****e 发帖数: 2024 | 2 虚表是在基类的ctor以后才创建的,故而,应该是 A的版本。
不知哪位师傅能把标准里的相应段落解释解释。 | t****t 发帖数: 6806 | 3 i thought it was B::invoke, but after i checked with standard, it is
actually undefined -- a->invoke() is called in Invoker::Invoker, but A is
not a base type of Invoker then it is undefined. the standard explicitly
said so, thus there is no question about it.
see 12.7, clause 3.
楼主的这系列问题, 质量不是很高. 请阅读者注意了.
【在 z****e 的大作中提到】 : 虚表是在基类的ctor以后才创建的,故而,应该是 A的版本。 : 不知哪位师傅能把标准里的相应段落解释解释。
| z****e 发帖数: 2024 | 4 是么?
我查了inside cpp model,
里边说,先构造B的基类,就是A和invoker,
然后才构造B自己的Vtable。
那么构造invoker的时候,B的Vtable还没有,所以就只能A的版本了。
不过如果你说是undefined,我学习一下。
【在 t****t 的大作中提到】 : i thought it was B::invoke, but after i checked with standard, it is : actually undefined -- a->invoke() is called in Invoker::Invoker, but A is : not a base type of Invoker then it is undefined. the standard explicitly : said so, thus there is no question about it. : see 12.7, clause 3. : 楼主的这系列问题, 质量不是很高. 请阅读者注意了.
| t****t 发帖数: 6806 | 5 你说的是实现上的考虑, 我也同意. 但是标准的规定有不同的考虑, 标准里根本不会出
现如vtbl或vptr这样的字眼. 所以标准里说的是, 在ctor/dtor里用的是"自己"的版本.
在构造invoker的时候, invoker没有"自己"的版本, 也没有基类的版本可以继承, 那
用谁的呢? 只好undefine了.
【在 z****e 的大作中提到】 : 是么? : 我查了inside cpp model, : 里边说,先构造B的基类,就是A和invoker, : 然后才构造B自己的Vtable。 : 那么构造invoker的时候,B的Vtable还没有,所以就只能A的版本了。 : 不过如果你说是undefined,我学习一下。
| z****e 发帖数: 2024 | 6 师傅,invoker这个类,根本就没有虚函数,这点我同意。
因为invoker就一个wrapper,就用B的this指针进行一个函数调用的作用。
标准的这句话,应该和invoker是没有关系的。因为虚函数和invoker无关,invoker也
没有调用自己的虚函数,因为根本就没有虚函数。
标准是说,在有虚函数的情况下,应该调用哪个。
invoker压根就没有虚函数,所以我感觉,标准这句话不能用在invoker上边。
实质上不是invoker在ctor里调用虚函数,本质上还是B在ctor里调用虚函数,应该调用
哪个。那B就之好按照顺序来了。
本.
【在 t****t 的大作中提到】 : 你说的是实现上的考虑, 我也同意. 但是标准的规定有不同的考虑, 标准里根本不会出 : 现如vtbl或vptr这样的字眼. 所以标准里说的是, 在ctor/dtor里用的是"自己"的版本. : 在构造invoker的时候, invoker没有"自己"的版本, 也没有基类的版本可以继承, 那 : 用谁的呢? 只好undefine了.
| t****t 发帖数: 6806 | 7 have you read the standard yet?
【在 z****e 的大作中提到】 : 师傅,invoker这个类,根本就没有虚函数,这点我同意。 : 因为invoker就一个wrapper,就用B的this指针进行一个函数调用的作用。 : 标准的这句话,应该和invoker是没有关系的。因为虚函数和invoker无关,invoker也 : 没有调用自己的虚函数,因为根本就没有虚函数。 : 标准是说,在有虚函数的情况下,应该调用哪个。 : invoker压根就没有虚函数,所以我感觉,标准这句话不能用在invoker上边。 : 实质上不是invoker在ctor里调用虚函数,本质上还是B在ctor里调用虚函数,应该调用 : 哪个。那B就之好按照顺序来了。 : : 本.
| z****e 发帖数: 2024 | 8 听师傅的话,有肉吃。
【在 t****t 的大作中提到】 : have you read the standard yet?
|
|