2、定义一个空的class a, 为什么sizeof(a) = 1,
12 个解决方案
#1
一个空的类,默认size是1
#2
(1)
B b;
A *p = dynamic_cast<A*>(&b);
如果p不空,则说明B是直接或间接从A派生的类。
B b;
A *p = dynamic_cast<A*>(&b);
如果p不空,则说明B是直接或间接从A派生的类。
#3
似乎没有必要进行运行时判断,因为不是对象的判断,这样的话,只要看B*能否直接转换到A*就可以了吧?
空class的大小为1是因为如果大小为0的话,那么将会产生巨大的问题(譬如后面还有一个其他的对象,此时就会一下跨到另外对象的地址上去),而分配1字节的空间可以保证你还在自己的空间内……
不过纯粹的空类没有意义,一般是还要有成员函数……
空class的大小为1是因为如果大小为0的话,那么将会产生巨大的问题(譬如后面还有一个其他的对象,此时就会一下跨到另外对象的地址上去),而分配1字节的空间可以保证你还在自己的空间内……
不过纯粹的空类没有意义,一般是还要有成员函数……
#4
CAge a(21); // Must use IMPLEMENT_DYNAMIC or IMPLEMENT_SERIAL
ASSERT( a.IsKindOf( RUNTIME_CLASS( CAge ) ) );
ASSERT( a.IsKindOf( RUNTIME_CLASS( CObject ) ) );
ASSERT( a.IsKindOf( RUNTIME_CLASS( CAge ) ) );
ASSERT( a.IsKindOf( RUNTIME_CLASS( CObject ) ) );
#5
包含虚函数的类才能在运行时判断
#6
(1)
B b;
A *p = dynamic_cast<A*>(&b);
如果p不空,则说明B是直接或间接从A派生的类。
这个方法不行把。
如果a中包含了一个类b的对象,且构造函数只有一个参数,这种情况可能行不通!
B b;
A *p = dynamic_cast<A*>(&b);
如果p不空,则说明B是直接或间接从A派生的类。
这个方法不行把。
如果a中包含了一个类b的对象,且构造函数只有一个参数,这种情况可能行不通!
#7
楼上说what?还没被咸死?
#8
GZ,学习!
#9
(1)
B b;
A *p = dynamic_cast<A*>(&b);
如果p不空,则说明B是直接或间接从A派生的类。
这样的方法是可行的,不过在以下情况是不行的:
B类通过不同的路径从多于一个A派生,则这个调用不能被编译.要再加上中间类
注意:不要 (A*)&b; 这样的C风格转型从来都不会失败,(如果能编译通过的话)
B b;
A *p = dynamic_cast<A*>(&b);
如果p不空,则说明B是直接或间接从A派生的类。
这样的方法是可行的,不过在以下情况是不行的:
B类通过不同的路径从多于一个A派生,则这个调用不能被编译.要再加上中间类
注意:不要 (A*)&b; 这样的C风格转型从来都不会失败,(如果能编译通过的话)
#10
每个类都有默认的构造函数。
派生类的对象大于BASE CLASS的对象
派生类的对象大于BASE CLASS的对象
#11
(1)
B * pb;
A * pa = pb; // 如果无关,会出错吧?
Enoch 兄不愧是 VC 过来的……
(2)
作为内存占位符用。如果组合在其它类内,或者其它可以优化的情况,很可能被优化为 0 大小。
B * pb;
A * pa = pb; // 如果无关,会出错吧?
Enoch 兄不愧是 VC 过来的……
(2)
作为内存占位符用。如果组合在其它类内,或者其它可以优化的情况,很可能被优化为 0 大小。
#1
一个空的类,默认size是1
#2
(1)
B b;
A *p = dynamic_cast<A*>(&b);
如果p不空,则说明B是直接或间接从A派生的类。
B b;
A *p = dynamic_cast<A*>(&b);
如果p不空,则说明B是直接或间接从A派生的类。
#3
似乎没有必要进行运行时判断,因为不是对象的判断,这样的话,只要看B*能否直接转换到A*就可以了吧?
空class的大小为1是因为如果大小为0的话,那么将会产生巨大的问题(譬如后面还有一个其他的对象,此时就会一下跨到另外对象的地址上去),而分配1字节的空间可以保证你还在自己的空间内……
不过纯粹的空类没有意义,一般是还要有成员函数……
空class的大小为1是因为如果大小为0的话,那么将会产生巨大的问题(譬如后面还有一个其他的对象,此时就会一下跨到另外对象的地址上去),而分配1字节的空间可以保证你还在自己的空间内……
不过纯粹的空类没有意义,一般是还要有成员函数……
#4
CAge a(21); // Must use IMPLEMENT_DYNAMIC or IMPLEMENT_SERIAL
ASSERT( a.IsKindOf( RUNTIME_CLASS( CAge ) ) );
ASSERT( a.IsKindOf( RUNTIME_CLASS( CObject ) ) );
ASSERT( a.IsKindOf( RUNTIME_CLASS( CAge ) ) );
ASSERT( a.IsKindOf( RUNTIME_CLASS( CObject ) ) );
#5
包含虚函数的类才能在运行时判断
#6
(1)
B b;
A *p = dynamic_cast<A*>(&b);
如果p不空,则说明B是直接或间接从A派生的类。
这个方法不行把。
如果a中包含了一个类b的对象,且构造函数只有一个参数,这种情况可能行不通!
B b;
A *p = dynamic_cast<A*>(&b);
如果p不空,则说明B是直接或间接从A派生的类。
这个方法不行把。
如果a中包含了一个类b的对象,且构造函数只有一个参数,这种情况可能行不通!
#7
楼上说what?还没被咸死?
#8
GZ,学习!
#9
(1)
B b;
A *p = dynamic_cast<A*>(&b);
如果p不空,则说明B是直接或间接从A派生的类。
这样的方法是可行的,不过在以下情况是不行的:
B类通过不同的路径从多于一个A派生,则这个调用不能被编译.要再加上中间类
注意:不要 (A*)&b; 这样的C风格转型从来都不会失败,(如果能编译通过的话)
B b;
A *p = dynamic_cast<A*>(&b);
如果p不空,则说明B是直接或间接从A派生的类。
这样的方法是可行的,不过在以下情况是不行的:
B类通过不同的路径从多于一个A派生,则这个调用不能被编译.要再加上中间类
注意:不要 (A*)&b; 这样的C风格转型从来都不会失败,(如果能编译通过的话)
#10
每个类都有默认的构造函数。
派生类的对象大于BASE CLASS的对象
派生类的对象大于BASE CLASS的对象
#11
(1)
B * pb;
A * pa = pb; // 如果无关,会出错吧?
Enoch 兄不愧是 VC 过来的……
(2)
作为内存占位符用。如果组合在其它类内,或者其它可以优化的情况,很可能被优化为 0 大小。
B * pb;
A * pa = pb; // 如果无关,会出错吧?
Enoch 兄不愧是 VC 过来的……
(2)
作为内存占位符用。如果组合在其它类内,或者其它可以优化的情况,很可能被优化为 0 大小。