由买买提看人间百态

boards

本页内容为未名空间相应帖子的节选和存档,一周内的贴子最多显示50字,超过一周显示500字 访问原贴
Programming版 - C++ Q20: construction and inheritance
相关主题
one question about operator deleteC++ vector
经典C++问题求助不明白C++的一个地方
C++问题几个问个虚函数的作用
question about const referenceC#程序调用Windows C++ DLL的问题
A try-catch problem in C++question on divide by zero
请教一个MS Linked List的问题弱问mcc和mex的区别
copy constructor问题。Listing files under a directory in C++
python和java里面非memory资源怎么回收?heap 和 stack问题
相关话题的讨论汇总
话题: invoker话题: invoke话题: c++话题: q20话题: goodbye
进入Programming版参与讨论
1 (共1页)
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?
1 (共1页)
进入Programming版参与讨论
相关主题
heap 和 stack问题A try-catch problem in C++
也问个template 的问题(C++)请教一个MS Linked List的问题
C++ Q17: throw 2copy constructor问题。
private destructorpython和java里面非memory资源怎么回收?
one question about operator deleteC++ vector
经典C++问题求助不明白C++的一个地方
C++问题几个问个虚函数的作用
question about const referenceC#程序调用Windows C++ DLL的问题
相关话题的讨论汇总
话题: invoker话题: invoke话题: c++话题: q20话题: goodbye