VC中如何判断B类是由A类派生的?还有...

时间:2021-03-10 19:58:31
1、如何判断B类是由A类派生?类类似于delphi中的 is;
2、定义一个空的class a, 为什么sizeof(a) = 1,

12 个解决方案

#1


一个空的类,默认size是1

#2


(1)
B b;
A *p = dynamic_cast<A*>(&b);
如果p不空,则说明B是直接或间接从A派生的类。

#3


似乎没有必要进行运行时判断,因为不是对象的判断,这样的话,只要看B*能否直接转换到A*就可以了吧?

空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 ) ) );

#5


包含虚函数的类才能在运行时判断

#6


(1)
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风格转型从来都不会失败,(如果能编译通过的话)

#10


每个类都有默认的构造函数。
派生类的对象大于BASE CLASS的对象

#11


(1)
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派生的类。

#3


似乎没有必要进行运行时判断,因为不是对象的判断,这样的话,只要看B*能否直接转换到A*就可以了吧?

空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 ) ) );

#5


包含虚函数的类才能在运行时判断

#6


(1)
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风格转型从来都不会失败,(如果能编译通过的话)

#10


每个类都有默认的构造函数。
派生类的对象大于BASE CLASS的对象

#11


(1)
B * pb;
A * pa = pb; // 如果无关,会出错吧?

Enoch 兄不愧是 VC 过来的……

(2)
作为内存占位符用。如果组合在其它类内,或者其它可以优化的情况,很可能被优化为 0 大小。