如何在多重继承中指定从其派生的基类

How can specify the base class from whom I derive in multiple inheritance?

本文关键字:派生 基类 多重继承      更新时间:2023-10-16

我有一个编程课程的作业,要求我设计一个抽象,从中派生出两个类,并从这两个派生类派生出另一个类。

这带来了致命死亡之钻的问题。这可以通过虚拟继承来解决,尽管我需要将前两个类的对象实例化为抽象类的指针。这是任何形式的虚拟继承都无法做到的。因此,如果有一种方法可以指定多重继承类将从中派生的基类,那将是非常有用的。

的例子:

#include <iostream>
using namespace std;
class Base {
    public:
        virtual void foo(){};
        virtual void bar(){};
};
class Der1 : public Base {  
    public:
        virtual void foo();
};
void Der1::foo()
{
    cout << "Der1::foo()" << endl;
}
class Der2 : public Base {
    public:
        virtual void bar();
};
void Der2::bar()
{
        cout << "Der2::bar()" << endl;
}
class Join : virtual Der1, virtual Der2 {
    private:
        int atribb;

};
int main()
{
        Base* obj = new Join();
        ((Der1 *)(obj))->foo();
}

编译错误:

nueve.cpp: In function ' int main() ':

nueve.cpp:43:30: error: ' Base '是' Join '的二义基

Base* obj = new Join();

使用虚拟继承

class Der1 : public virtual Base {  
    public:
        virtual void foo();
};

class Der2 : public virtual Base {
    public:
        virtual void bar();
};

如果virtual是在基类派生时声明的,如下面的例子所示,最派生的类对象只包含一个基类子对象,这有助于解决这种情况下的歧义。

在做了一些代码修改之后,你的最终可执行代码:

代码修改如下:

在派生子类时增加了虚拟关键字。删除了"virtual"关键字,同时派生大多数派生类。修改了main以正确调用成员函数。

#include <iostream>
using namespace std;
class Base {
    public:
        virtual void foo(){};
        virtual void bar(){};
};
class Der1 : public virtual Base {  
    public:
        virtual void foo();
};
void Der1::foo()
{
    cout << "Der1::foo()" << endl;
}
class Der2 : public virtual Base {
    public:
        virtual void bar();
};
void Der2::bar()
{
        cout << "Der2::bar()" << endl;
}
class Join : public Der1, public Der2 {
    private:
        int atribb;

};
int main()
{
        Base* obj = new Join();
        obj->foo();
}

不清楚你在要求什么,尽管你似乎在说从Base的虚拟继承是不合适的。所以,假设这是正确的,你可以用Base* obj = (Der1*)new Join();代替Base* obj = new Join();,你会得到一个指向Base对象的指针,这是Der1的基础。同样,你可以用Base* obj = (Der2*)new Join();替换它,你会得到一个指向Base对象的指针,这是Der2的基础。