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

标签 c++ class inheritance multiple-inheritance virtual-inheritance

我最近在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/

相关文章:

css - 更改现有 CSS 阴影的方向

类 java 继承的 VBA 组合

c++ - 从 MFC CDialog 上的子控件接收 WM_MOUSEMOVE

c++ - 在 C++ 11 函数中处理非严重错误的推荐方法是什么

ruby - 方法定义中的额外表达式

java - 是否可以使用扩展父类(super class)方法参数的参数覆盖父类(super class)方法?

c++ - 将图像转换为占用网格

c++ - 为什么我不能将函数指针作为模板参数传递给 map ?

ios - 如何从现有的 View Controller 类中调用函数?

php - 为什么没有构造函数子类不能访问父类属性?