Posts Tagged ‘C++’

[C++]一个由C-Style类型转换引发的血案

3 Comments »

没事搜了一下自己域名,无意间发现老早提交的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 »


类继承的开销 ——《Inside the C++ Object Model》笔记二

No Comments »

一、不含多态的继承

即基类里没有虚函数。这时候派生类成员的存取时间并没有增加,但是空间上会有浪费。比如有如下两个类

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 »


构造函数 ——《Inside the C++ Object Model》笔记一

No Comments »

Inside the C++ Object Model Chapter 2 : The Semantics of Constructor 构造函数语义学

一、默认构造函数 Default Constructor

C++编译器会在Class的每一个构造函数中通过添加代码的方法暗中(implicit)做了下面几件事:

  1. 如果在这个构造函数没有对所有Member Class Object进行构造, 编译器会调用余下没有构造的Member Class Object的默认构造函数;
  2. 如果此构造函数没有提供基类构造函数的参数列表, 编译器会调用基类的默认构造函数;
  3. 如果类中含有虚函数,编译器会利用构造函数产生一张virtual function table(vbtl),并在每个Class Object中添加一个vprt(指向vbtl的指针);
  4. 如果类有Virtual Base Class虚基类,编译器会在构造函数中添加代码, 允许每个虚基类的执行期存取操作。

Read the rest of this entry »