如何在多重继承中指定从其派生的基类
How can specify the base class from whom I derive in multiple inheritance?
我有一个编程课程的作业,要求我设计一个抽象,从中派生出两个类,并从这两个派生类派生出另一个类。
这带来了致命死亡之钻的问题。这可以通过虚拟继承来解决,尽管我需要将前两个类的对象实例化为抽象类的指针。这是任何形式的虚拟继承都无法做到的。因此,如果有一种方法可以指定多重继承类将从中派生的基类,那将是非常有用的。
的例子:
#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 '的二义基
使用虚拟继承
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
的基础。
相关文章:
- 如何通过派生类函数更改基类中的向量
- 如何使用基类指针引用派生类成员
- 使用基类指针创建对象时,缺少派生类析构函数
- 如何引用基类的派生类?
- 如果基类包含双指针成员,则派生类的构造函数
- 为什么此派生对象无法访问基类的后递减方法?
- 使用基类中的派生方法运行线程,而无需使用模板
- 是否可以使用基类非虚拟方法中的派生类虚拟方法?
- C++重载函数,一个采用基类的参数,另一个采用派生类的参数
- 在派生类中使用基类的私有成员变量的最佳方法
- 基类和派生类的多态赋值运算符
- 如何在从抽象基派生的类中实现相同的方法?
- 基类的填充将被复制到派生类中
- 如何在不使用指针的情况下将派生类的对象作为参数传递给基类中的函数?
- 指向基类派生类的 std::unique_ptr 的指针
- 为什么基类数据在派生类数据之前初始化
- c++ 派生基类 Friend 函数访问父级上的私有函数
- 如何将基类替换为派生基类
- 当基类未指定构造函数时,如何使用仅具有带参数的构造函数的类派生基类?
- 解析公用派生基类模板中的函数模板名称时出错"Not declared in this scope"