c++中一些基本的继承问题

Some basic Inheritance problems in C++

本文关键字:继承 问题 c++      更新时间:2023-10-16

这些天我正在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()有三个实现,它不知道该使用哪个。如果非虚拟派生,则在A、B和D类中嵌入三个B基,每个B基都可以覆盖实现。或者,您已经发现可以用c中的一个实现替换虚继承之后的模糊实现。

Q2:在非虚拟情况下,您在嵌入的A, B和D对象中有三个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基数