多个继承和数据成员
|
我从未使用多重继承,却偶然遇到了我从未遇到过的设计问题。
class A {
//..methods..
}
class B : public A {
int b;
//...methods..
}
class C : public A {
int c1,c2;
}
class D : public B,public C {
}
这是经典的钻石。事实是C
实际上只是带有两个额外整数的A
。而ѭ3really实际上只是B
和ѭ1aggregation的集合,但我觉得多重继承并不是为了制造这样的东西而设计的。或可能存在其他最佳做法。
我尝试实现多重继承的原因是我想编写一个类似于void func(A*)
的函数并将其传递给A
或D
类指针。我的巧妙尝试是进行简单的转换:
void func(A* a) { // <-- I call this with a A or D pointer
// ..do something with A members..
if(is_the_case) { // <-- Im sure the passed \"a\" pointer is actually a *D
D* d = (D*)a;
// ..do something with the extra 2 ints provided by the C class..
}
}
编译正常,但是执行if(is_the_case)
时我有一个非常奇怪的行为,清除了两个额外的整数c1
和c2
,也清除了b
(由B
继承)。
我对钻石问题怀念不已,但这里的层次结构中只有一个B
(和2个A
),所以我不明白为什么还清理了b
。为了尝试,我在B
和C
声明中使用了public virtual。现在,除非我使用dynamic_cast
,否则每个强制转换都是编译错误。
有人可以说清楚幕后发生的事情吗?考虑到还有其他类似的课程,什么是最佳做法?
class E : public A {
int e;
//..methods..
}
class F : public E,public C {
}
也就是说,其他类仅仅是从A
派生的类的集合+by1ѭ继承的两个额外的int的集合,并且可以传递给采用*A
的函数
谢谢,我已尽我所能。
没有找到相关结果
已邀请:
3 个回复
疾桓
,并且据我了解,即使没有任何意义,您也可以在任意两个指针类型之间
。从多重继承的基数转换为更多派生的类时,必须使用ѭ20。
会产生编译时错误。实际上,
同时完成两项工作。
这是为什么应避免使用C型强制转换的一个很好的例子。
磐去裸猜饲
财沟项胶