我最近在VS2010中学习C++编程中的OO。我在 C++ 中遇到了一些基本的继承问题。这是我的代码:
问题 1:
class bs
{
public:
int a;
virtual void name(){};
};
class A:virtual public bs
{
public:
int a;
virtual void name(){};
};
class B:virtual public bs
{
public:
int a;
virtual void name(){};
};
class D:virtual public bs
{
public:
int a;
virtual void name(){};
};
class C:public A,public B,public D
{
};
编译器给我错误 C2250。当我从每个类中删除虚拟继承时。即
class bs
{
public:
int a;
virtual void name(){};
};
class A:public bs
{
public:
int a;
virtual void name(){};
};
class B:public bs
{
public:
int a;
virtual void name(){};
};
class D:public bs
{
public:
int a;
virtual void name(){};
};
class C:public A,public B,public D
{
};
生效。另外,如果我在错误代码中重写类C中的virtual void name(){};
,编译器运行良好。所以我的问题是为什么有必要强制重写虚函数虚继承情况,非虚继承情况不必要。
问题 2:
如上代码,当我想在非虚拟继承的情况下添加bs *mybs = new C();
class bs
{
public:
int a;
virtual void name(){};
};
class A:public bs
{
public:
int a;
virtual void name(){};
};
class B:public bs
{
public:
int a;
virtual void name(){};
};
class D:public bs
{
public:
int a;
virtual void name(){};
};
class C:public A,public B,public D
{
virtual void name(){};
};
//bs *mybs = new C(); //C2594
编译器提示错误 C2594。但是在虚拟继承的情况下,编译器没有报错。
class bs
{
public:
int a;
virtual void name(){};
};
class A:virtual public bs
{
public:
int a;
virtual void name(){};
};
class B:virtual public bs
{
public:
int a;
virtual void name(){};
};
class D:virtual public bs
{
public:
int a;
virtual void name(){};
};
class C:public A,public B,public D
{
virtual void name(){};
};
bs *mybs = new C();//It is OK
虚拟继承情况是怎么回事?
我觉得这两个问题不难,但是C++的基础。但是,我不熟悉 C++ 版本中的 OO。感谢您解决问题。
最佳答案
Q1:给定虚继承,派生类只得到bs
对象的一个实例,而name()
有3个实现,没有知道使用哪个。如果非虚派生,那么A、B、D类中嵌入了三个bs基,每个基都可以覆盖实现。或者,您发现可以用 C 中的一个实现替换虚拟继承后的不明确实现。
Q2:在非虚的情况下,你在嵌入的A、B、D对象中有3个bs
基:你要指针指向其中的哪一个?这是模棱两可的,所以你得到了错误。如果您使用虚拟继承,那么只有一个 bs
基础对象,您可以获得一个指向它的指针。
举例说明:
VIRTUAL NON-VIRTUAL
. bs bs bs bs
. / | \ | | |
. A B D A B D
. \ | / \ | /
. C C
在左边,您的问题是 C
不知道 A::name()
、B::name()
或 D::name()
除非您在 C
中覆盖所有三个。
右边,你的问题是 b* my_b_ptr
不知道要指向哪个 bs
基。
关于c++ - C++中一些基本的继承问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16434462/