C++ C++;纯虚函数的多重继承问题
我制作了一个简单的示例,以复制我在更复杂的类层次结构中看到的问题:C++ C++;纯虚函数的多重继承问题,c++,inheritance,C++,Inheritance,我制作了一个简单的示例,以复制我在更复杂的类层次结构中看到的问题: #include <string> #include <iostream> class A { protected: virtual ~A() = 0; }; inline A::~A() {} class B : public A { public: virtual ~B() { } std::string B_str; }; c
#include <string>
#include <iostream>
class A
{
protected:
virtual
~A() = 0;
};
inline
A::~A() {}
class B : public A
{
public:
virtual
~B()
{
}
std::string B_str;
};
class BB : public A
{
public:
virtual
~BB()
{
}
std::string BB_str;
};
class C : public A
{
protected:
virtual
~C()
{
}
virtual
void Print() const = 0;
};
class D : public B, public BB, public C
{
public:
virtual
~D()
{
}
};
class E : public C
{
public:
void Print() const
{
std::cout << "E" << std::endl;
}
};
class F : public E, public D
{
public:
void Print_Different() const
{
std::cout << "Different to E" << std::endl;
}
};
int main()
{
F f_inst;
return 0;
}
因此编译器认为Print()
是纯虚拟的
但是,我已经指定了Print()
应该在类E
中的内容
所以,我误解了继承的一些规则
我的误解是什么?我怎样才能纠正这个问题
注意:如果我从
class F
中删除继承:public D
,它将编译。当前,您的F
以两种不同的方式派生自C
。这意味着一个F
对象有两个独立的C
基,因此有两个C::Print()
实例
您当前仅覆盖通过E
来的一个
要解决此问题,必须采取以下选项之一:
- 也可以通过实现
或D::Print()
来覆盖通过F::Print()
来实现的D
- 使
打印
非纯
- 使用虚拟继承,以便只有一个
基C
class E : virtual public C
及
这意味着D
和E
都将具有与其父类相同的C
实例,因此覆盖E::Print()
覆盖该C
的所有“下游”类的函数
有关更多信息,请查阅“菱形继承问题”。另请参见
F
也派生自D
,D
派生自C
,C
实例中的C::Print
未被覆盖。一个选项是使用虚拟继承,这意味着F
只有一个C
祖先,而D
和E
共享C
库。搜索术语是“菱形继承问题”@Mclassd
将用作基类指针向量的抽象基类。我无法在class D
中实现函数Print()
。我该怎么办?另一个选项是覆盖F
中的Print
(实现可能是调用E::Print();
)我尝试用virtual
继承类D
,但这没有帮助。。。?
class E : virtual public C
class D : public B, public BB, virtual public C