Posts Tagged ‘C++’
一月 11th, 2010
没事搜了一下自己域名,无意间发现老早提交的open directory申请居然通过了…想到一个多月没写东西,大惭…
为了尽快阻止这个连续N天没有日志的记录,先找一篇凑数…
先上开胃小菜 Appetizer
有人在byr论坛C++版上问了这样一道C++面试题:
class A {
public: void fun() { }
};
class B: public A {
public: virtual void fun() { }
};
class C: public B {
public: void fun(){}
};
class D: virtual public A {
public:
void fun(){}
};
int main(void) {
void *p;
((A*)NULL)->fun();
((C*)NULL)->fun(); // why fault here?
((D*)NULL)->fun();
return 0;
}
为什么在((C*)NULL)->fun()这句挂了呢?
Read the rest of this entry »
六月 20th, 2009
一、不含多态的继承
即基类里没有虚函数。这时候派生类成员的存取时间并没有增加,但是空间上会有浪费。比如有如下两个类
class X {
int a;
char b;
};
class Y : public X {
char c;
};
一个X对象占用4+1+3(padding, 假设4字节对齐) = 8字节。而一个Y对象并不是占用 4+1+1+2(padding)=8个字节,而是占用4+1+3(padding)+1+3(padding)=12个字节。编译器之所以如此设计,是为了使派生类对象中基类对象的内存结构和原始的基类对象一致,这种一致性保证了通过指针复制对象时不出错。如果按照前一种内存布局,会产生错误,比如:
Read the rest of this entry »
五月 15th, 2009
Inside the C++ Object Model Chapter 2 : The Semantics of Constructor 构造函数语义学
一、默认构造函数 Default Constructor
C++编译器会在Class的每一个构造函数中通过添加代码的方法暗中(implicit)做了下面几件事:
- 如果在这个构造函数没有对所有Member Class Object进行构造, 编译器会调用余下没有构造的Member Class Object的默认构造函数;
- 如果此构造函数没有提供基类构造函数的参数列表, 编译器会调用基类的默认构造函数;
- 如果类中含有虚函数,编译器会利用构造函数产生一张virtual function table(vbtl),并在每个Class Object中添加一个vprt(指向vbtl的指针);
- 如果类有Virtual Base Class虚基类,编译器会在构造函数中添加代码, 允许每个虚基类的执行期存取操作。
Read the rest of this entry »