- 论坛徽章:
- 0
|
本帖最后由 pan_0326 于 2010-06-08 16:35 编辑
回复 pan_0326
我关心的是:与C++比有啥区别?比C++有啥优点?克服了C++的哪些不足?
seecu 发表于 2010-06-04 13:03 ![]()
Coo的初衷只是让C可以OO,由于不是原生支持,当然会有不少缺点:
1. 书写仍然不能像C++那么简单,特别是虚函数
2. 无法实现同名函数
3. 无法自动构造和析构
但也不是样样不如C++
1. 嵌入基类的位置灵活,C++只能在首部
class CBase
{
public:
double d;
};
class CThis : public CBase
{
public:
int i;
virtual int GetInt() const;
};
sizeof(CBase)是8,sizeof(CThis)是24,不是16.因为翻译成Coo如下:
struct VThis; //虚函数类
typedef struct CThis
{
VT(struct VThis) //虚函数表指针
EXTENDS(CBase) //继承
int i;
} CThis;
但Coo由于继承的语法更灵活,所以可以这样改:
struct VThis; //虚函数类
typedef struct CThis
{
VT(struct VThis) //虚函数表指针
int i; //提前数据,找齐
EXTENDS(CBase) //继承
} CThis;
基类数据嵌入可以不发生在首部,现在sizeof(CThis)是16,最紧缩状态.
2. 类数据中嵌入虚函数表指针可以有多种方法,而C++只有一种
class CBase
{
public:
int a
virtual int GetA() const;
};
class CInterface
{
public:
virtual void SetA(int a);
};
class CThis : public CBase, public CInterface
{
};
sizeof(CBase)是8,sizeof(CInterface)是4,sizeof(CThis)是12.翻译成Coo如下:
struct VBase; //虚函数类
typedef struct CBase
{
VT(struct VBase) //虚函数表指针
int a;
} CBase;
struct VInterface;
typedef struct CInterface
{
VT(struct VInterface)
} CBase;
struct VThis;
typedef struct CThis
{
EXTENDS2(CBase,struct VThis)
EXTENDS(CInterface)
} CThis;
但Coo可以不在类数据中嵌入虚函数表指针:
struct VBase; //虚函数类
typedef struct CBase
{
int a;
} CBase;
struct VInterface;
typedef struct CInterface
{
} CBase;
struct VThis;
typedef struct CThis
{
EXTENDS(CBase)
EXTENDS(CInterface)
} CThis;
sizeof(CBase)是4,sizeof(CInterface)是0,sizeof(CThis)是4.使用时可能要将
虚函数表指针当参数转入需要函数.
下面再展示一种混合方式:
struct VBase; //虚函数类
typedef struct CBase
{
VT(struct VBase) //虚函数表指针
int a;
} CBase;
struct VInterface;
typedef struct CInterface
{ //无虚函数表指针
} CBase;
struct VThis;
typedef struct CThis
{
EXTENDS(CInterface) //空的,占位
EXTENDS2(CBase,struct VThis)
} CThis;
sizeof(CBase)是8,sizeof(CInterface)是0,sizeof(CThis)是8.主继承链嵌入
虚函数表指针,而接口等不嵌入虚函数表指针,有点像java |
|