Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/158.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++;多重继承和多重实现编译但崩溃 我遇到了一个我以前从未见过的奇怪的C++继承模式:_C++_Design Patterns_Multiple Inheritance - Fatal编程技术网

C++;多重继承和多重实现编译但崩溃 我遇到了一个我以前从未见过的奇怪的C++继承模式:

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

有两个接口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 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*
,但是像这样将层次结构从一个“表亲”向下转换似乎不应该是有效的。你从不检查转换是否成功-这是懒惰的。