【发布时间】:2013-12-25 02:18:52
【问题描述】:
我遇到了一种我以前从未见过的奇怪的 C++ 继承模式:
有两个接口 A 和 B。每个接口都有两个不同的实现,分别称为 A1 和 A2,B1 和 B2。此外,还有一个接口 AB 继承自接口 A 和 B,并且有两个派生类 AB1 和 AB2 使用实现 A1 和 B1、A2 和 B2。
问题是:
如果我有一个 AB 的指针,有没有办法分配一个 AB1 或 AB2 的指针?下面的代码演示了这个问题。它至少可以使用 g++ 4.6 或更高版本进行编译,但会产生 seg-fault。如果我使用动态转换运算符,编译器会接受从 AB1* 到 AB* 的赋值。
#include <iostream>
// first interface and implementations
struct A
{
virtual void a() = 0;
};
struct A1 : public A
{
void a() { std::cout << "A1\n"; };
};
struct A2 : public A
{
void a() { std::cout << "A2\n"; }
};
// second interface and implementations
struct B
{
virtual void b() = 0;
};
struct B2 : public B
{
void b() { std::cout << "B2\n"; }
};
// combining interfaces and implementations
struct AB : public A, public B
{};
struct B1 : public B
{
void b() { std::cout << "B1\n"; }
};
struct AB1 : public A1, public B1
{};
struct AB2 : public A2, public B2
{};
int main()
{
AB1* ab1 = new AB1();
ab1->a();
ab1->b();
AB2* ab2 = new AB2();
ab2->a();
ab2->b();
// this code compiles but doesnt work
AB* ab;
ab = dynamic_cast<AB*>(ab1);
ab->a();
ab->b();
ab = dynamic_cast<AB*>(ab2);
ab->a();
ab->b();
return 0;
}
我最好的猜测是,AB1、AB2 和 AB 的对象布局是不同的。但是,为什么动态演员表会起作用?
谁能告诉我有关此 Code Pattern 的更多信息?
非常感谢, 无用的
【问题讨论】:
-
struct AB不在AB1或AB2的继承层次结构中(即它不是AB1或AB2的父级或子级)。似乎充其量您可以转换为共同的祖先A*或B*,但是将层次结构从像这样的“表亲”重新转换似乎不应该是有效的。 -
你从不检查演员表是否成功——这太懒了。
标签: c++ design-patterns multiple-inheritance