【发布时间】:2012-01-12 15:42:52
【问题描述】:
我有以下程序:
#include <initializer_list>
#include <iostream>
class A;
class nih {
public:
virtual void apply(A & a) const { std::cout << "generic" << std::endl; };
};
union niit;
class A {
public:
int s; char kau;
A() : s(1), kau('-') { }
A(std::initializer_list<niit> k);
};
class sn : public nih { int s; public: sn(int x) : s(x) { }
virtual void apply(A & a) const { a.s=s; } };
class kaun : public nih { char kau; public: kaun(char x) : kau(x) { }
virtual void apply(A & a) const { a.kau=kau; } };
union niit { sn sni; kaun kauni; nih nihi;
niit(const sn & s) : sni(s) { }
niit(const kaun & k) : kauni(k) { }
};
A::A(std::initializer_list<niit> k) {
const niit *n=k.begin();
for(int i=0;i<k.size();i++) {
const nih* p=&n[i].nihi;
p->apply(*this);
}
}
int main(int argc, char**argv) {
A r {kaun('a'),sn(91)};
std::cout << r.s << r.kau << std::endl;
}
我得到了预期的结果,即91a。但是,如果我换行
p->apply(*this);
到以下:
((const nih*)(&n[i].nihi))->apply(*this);
应该用等效值替换,它不再起作用,而是打印:
generic
generic
0
也就是说,它执行来自nih 的泛型方法。这是为什么?我尝试了带有选项-std=c++0x 的 gcc 4.6,以防万一。
【问题讨论】:
标签: c++ pointers initialization virtual unions