C++;多重继承和多重实现编译但崩溃 我遇到了一个我以前从未见过的奇怪的C++继承模式:
有两个接口A和B。每个接口有两个不同的实现,分别称为A1和A2、B1和B2。此外,还有一个接口AB继承自接口A和B,还有两个派生类AB1和AB2使用实现A1和B1、A2和B2 问题是: 如果我有一个AB指针,有没有办法分配一个AB1或AB2指针?下面的代码演示了这个问题。它至少可以用g++4.6或更高版本编译,但它会产生seg错误。如果使用动态强制转换运算符,编译器将接受从AB1*到AB*的赋值C++;多重继承和多重实现编译但崩溃 我遇到了一个我以前从未见过的奇怪的C++继承模式:,c++,design-patterns,multiple-inheritance,C++,Design Patterns,Multiple Inheritance,有两个接口A和B。每个接口有两个不同的实现,分别称为A1和A2、B1和B2。此外,还有一个接口AB继承自接口A和B,还有两个派生类AB1和AB2使用实现A1和B1、A2和B2 问题是: 如果我有一个AB指针,有没有办法分配一个AB1或AB2指针?下面的代码演示了这个问题。它至少可以用g++4.6或更高版本编译,但它会产生seg错误。如果使用动态强制转换运算符,编译器将接受从AB1*到AB*的赋值 #include <iostream> // first interface and
#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;
}
#包括
//第一个接口和实现
结构A
{
虚空a()=0;
};
结构A1:公共A
{
void a(){std::cout b();
//这段代码可以编译,但不起作用
AB*AB;
ab=动态铸型(ab1);
ab->a();
ab->b();
ab=动态铸型(ab2);
ab->a();
ab->b();
返回0;
}
我最好的猜测是,AB1、AB2和AB的对象布局是不同的。但是,为什么动态演员阵容会起作用呢
有人能告诉我关于这个代码模式的更多信息吗
非常感谢,,
schluchtenbummler当无法执行强制转换时,
ab1
和ab2
都不能强制转换到AB
dynamic\u cast
将返回NULL(如果使用C++11,则返回NULL ptr)。在尝试访问它之前,您应该检查AB
中的nullptr
。您在问题中说过“为什么动态强制转换工作?”…答案是,它不工作,但您没有检查返回值以查看是否是这种情况。动态强制转换(x)的结果如果x
是指向动态类型不是AB
或其派生类型的对象的指针,则将是0
。因为AB
可能稍后被注入继承图的某个位置,如果具体对象使用多个inheri继承层次,则可以使用dynamic\u cast
跨层次进行强制转换例如,编译器没有理由假设庞德不指向可能是AB
struct AB
的对象。AB
不在AB1
或AB2
的继承层次结构中(即,它不是AB1
或AB2
的父对象或子对象)。看起来你最多只能将其转换为一个共同的祖先a*
或B*
,但是像这样将层次结构从一个“表亲”向下转换似乎不应该是有效的。你从不检查转换是否成功-这是懒惰的。